第三方授权后的自动登陆怎么做?怎么做才安全?

首先,第三方授权怎么做请百度。

正文,请先看代码

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种情况 我认为是安全的;

第3种情况 我认为不安全在于,一是修改expires_in可以一直能够登录该app,二是修改uid也许就能登录别人的账号。

详细请见上面代码注释,只附下代码

(sina微博的Token类)

  public boolean isSessionValid()
  {
    return !TextUtils.isEmpty(mAccessToken);
  }

qq的Token类也是类似的判断。

第4种情况,本来我是觉得这样子很麻烦,但似乎没有其他方案,比如通过一个方法不用拉取授权页就能向sns平台调取上一次的Token,因为你保存这个Token在本地那就不安全,但是目前我没有找到这个方法。

一点点安慰,看了下qq斗地主和雷霆战机 这两款app对QQ自动登录也是使用的方案4。

思考了下第4种的替代,就是同意授权登陆后到本app服务器获取用户名和密码保存,但是造成了密码泄露,另外服务器也可能不直接存储密码,所以还是别这么用。

你可能感兴趣的:(第三方授权登陆,账号安全)