首先,第三方受权怎么作请百度。java
正文,请先看代码sql
public class MyApplication extends Application { public static Context context;//登陆的用户id public static String username;//登陆的用户名 public static int userid;//登陆的用户id public static boolean loginflag;//用户的登陆状态 @Override public void onCreate() { loginflag=false; context=this; checkLogin(); } public void checkLogin() { new Thread(){ @Override public void run() { super.run(); //本app本身的帐户系统 //1.使用保存的登录状态(需保存用户状态和至少一个惟一性字段,如用户id;可是明显不安全) //2.请求服务器登录(使用保存的用户名和密码) //借助sns的受权登录 //3.使用保存下来的Token验证,无需发送给服务器了(最终也是不安全) //第3种状况 参考各sns平台的Token类的有效性判断方法boolean isSessionValid() //发现: //保存Token都是有风险的,并且本地的数据又能够伪造+Token类自己的判断只依赖这种数据 //那么就同 第1种 相似了 //4.每次都调出sns平台的受权页,如同第一次受权般 } }.start(); }
首先这有个假设,就是能够人为地对程序保留数据(如sqlite、sharedpreferences)进行更改。没有root的安卓设备彷佛不能够改,但已root的安卓设备应该能够改。由于我没有设备可测,可是使用AVD模拟器,发现能够导入导出sharedpreferences的xml和使用adb进入sqlite,应该也能够修改。而猜测AVD至关因而已root的安卓设备。安全
第1种状况 明显不安全在于,只修改用户id就能够登陆别人的帐号了;服务器
第2种状况 我认为是安全的;app
第3种状况 我认为不安全在于,一是修改expires_in能够一直可以登陆该app,二是修改uid也许就能登陆别人的帐号。ide
详细请见上面代码注释,只附下代码ui
(sina微博的Token类)this
public boolean isSessionValid() { return !TextUtils.isEmpty(mAccessToken); }
qq的Token类也是相似的判断。code
第4种状况,原本我是以为这样子很麻烦,但彷佛没有其余方案,好比经过一个方法不用拉取受权页就能向sns平台调取上一次的Token,由于你保存这个Token在本地那就不安全,可是目前我没有找到这个方法。sqlite
一点点安慰,看了下qq斗地主和雷霆战机 这两款app对QQ自动登陆也是使用的方案4。
思考了下第4种的替代,就是赞成受权登录后到本app服务器获取用户名和密码保存,可是形成了密码泄露,另外服务器也可能不直接存储密码,因此仍是别这么用。