2016-04-29 117 views
3

我有一个Android应用程序,其登录信息通过https发送到Java休息API,验证登录凭据,然后发回一个响应,说明登录是否成功。我的问题很简单,我应该怎么做以确保用户在重新启动应用程序时不必再次登录?Android,使用Rest API登录

+0

你可以让你的API提供,您可以使用为将来的API请求验证用户身份验证密钥。您也可以设置此Auth令牌的有效性。有关更多信息,请阅读JSON Web令牌。 –

回答

3

有很多方法可以处理一次性登录,它很大程度上取决于架构如何在服务器端实现以使其工作。出于安全原因,通常登录API是closely coupled。让我举个例子,我的意思是closely coupled

当你想LoginMobile App工作一次,下一次用户打开你不想再次提示与SignIn屏用户的Mobile app。当然您不希望将移动应用上的UsernamePassword等机密信息保存为持久数据,因为它可以从Android设备轻松获取。那你干什么。

让我们假设您通过Android Device唯一的登录凭证deviceID。如下所示。以下是发送到LoginAPI

{ 
    "username": "[email protected]", 
    "password": "it's not a secret", 
    "deviceId": "123456789" 
} 

现在,当你不希望保存Login凭据JSON数据,服务器会在每次你登录到移动时生成一个随机的字母数字String将它传递给您回应应用。

{ 
    "Success": true, 
    "SuccessMessage": "credentials are correct, really!", 
    "ErrorMessage": null, 
    "Date": "dd/mm/yyyy", 
    "token": "1eghe4qha23aehraeh456789" // now this is a nasty String 
} 

你现在可以保存date和移动应用的token作为持久性数据。 因此,下次您的用户打开应用程序,您可以让用户绕过SignIn屏幕,并在后台您可以通过将其发送到服务器来检查用户令牌ID是否正确,如下所示。你可以选择SharedPreferences或创建一个file,并保存有

{ 
    "API_TYPE": "login", 
    "deviceId": "123456789", 
    "token": "1eghe4qha23aehraeh456789" 
} 

服务器可以检查对deviceID此令牌ID来检查,​​如果这是在设备和响应正确的令牌。

您可能会问为什么我们再次检查token,因为这是由服务器首先发送的,说明凭证是正确的。我同意你确实有一点,如果用户从网站更改密码或导致更改服务器上的令牌以更改该用户的令牌时,如果服务器拒绝由该服务提供的令牌你只需要用户再次登录。

这将确保用户在任何给定的时间点只登录到一个Android Device

+1

感谢您的帮助,这似乎是我见过的最好的方法。但是,我有一个问题,在设备上存储令牌的时间太长是不是不好的做法?如果用户每次首次登录后返回应用程序,您会推荐以下方法: 1.用户打开应用程序,将存储在共享首选项中的令牌和设备ID发送到服务器 。服务器用存储在服务器上的设备ID和令牌ID来验证设备ID和令牌ID ...... –

+1

3.然后服务器产生一个新令牌,如果步骤2成功,它就会发送一个新令牌成功消息 4.令牌ID然后在共享首选项中与从服务器接收到的新令牌更新。 会是矫枉过正?另外,你会建议做ssl的令牌检查吗? –

+0

@BenC,你注意到你实际上在这种方法中找到了一些环形孔。你提出的建议是可以做到的,'SSL'选项也是如此。请记住我已经添加了一个'Date'键,它将作为响应由服务器提供。这个日期可以用来检查'Si​​gnIn'上次成功发生的时间,并且可以在10,20或30天后使标记无效并且要求用户再次'SignIn' –

0

您可以在首次登录后存储凭据。 因此,当用户重新启动应用程序时,您可以自动进行请求认证。

你可以选择是最好的选择,以存储使用文档的凭据: Data-Storage

这是简单的,但也许不是最好的方式做到这一点。

+0

如果在auth中使用密码,请记住在存储之前进行加密。 – Adley

0

我有同样的problme,和我从服务器这样

{"error":0,"message":"ok","token":"7c75015e92e40511911e34752ee456e1","execute_time":"0.2723"} 

一个JSON数据,所以我一直在SharedPreferences的StuToken,当我的应用程序启动,检查StuToken它存在,像这

Map<String, String> loginInfo = InfoUtil.getLoginInfo(MainActivity.this); 
    if (loginInfo != null) { 
     if (loginInfo.get("StuToken") != null) { 
      getStuInfo(loginInfo.get("StuToken")); 
      Toast.makeText(MainActivity.this, "登录状态", Toast.LENGTH_SHORT).show(); 
     } else { 
      initIntent(LoginActivity.class); 
      this.finish(); 
     } 
    } else { 
     initIntent(LoginActivity.class); 
     this.finish(); 
    } 
} 

希望会为你工作

0

您可以使用共享的喜好来存储用户的价值和检查用户是否已经登录。你可以关注这个Link.

0

试着在你的闪屏Activity.You这个代码可以存储在sharedPrefence一个值来检查用户是否登录或没有。

public class SplashActivity extends AppCompatActivity { 

    private static final long TIME_OUT_MILI = 3000; 
    private SharedPreferences mAppPreferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 
     mAppPreferences = AppUtil.getAppPreferences(this); 

     new Handler().postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       if (mAppPreferences.getBoolean("is_Logged_in", false)) { 

        startActivity(new Intent(SplashActivity.this, MainActivity.class)); 

       } else { 

        startActivity(new Intent(SplashActivity.this, LoginActivity.class)); 

       } 
       finish(); 
      } 
     }, TIME_OUT_MILI); 
    } 


} 

在你LoginActivity我们做到这一点:

public class LoginActivity extends AppCompatActivity { 
private SharedPreferences mAppPreferences; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
      SharedPreferences.Editor editor = mAppPreferences.edit(); 
editor.putBoolean(Constants.SETTINGS_IS_LOGGED_IN, true); 
         editor.commit(); 
} 
}