Android,使用RESTAPI登录
我有一个android应用程序,它的登录名通过https将登录信息发送到java rest api,java rest api验证登录凭据,然后返回一个响应,说明登录是否成功。我的问题很简单,我应该如何确保用户在重新启动应用程序时不必再次登录?您可以在首次登录后存储凭据。 因此,当用户重新启动应用程序时,您可以自动对请求进行身份验证 您可以选择使用文档存储凭据的最佳选项:Android,使用RESTAPI登录,android,Android,我有一个android应用程序,它的登录名通过https将登录信息发送到java rest api,java rest api验证登录凭据,然后返回一个响应,说明登录是否成功。我的问题很简单,我应该如何确保用户在重新启动应用程序时不必再次登录?您可以在首次登录后存储凭据。 因此,当用户重新启动应用程序时,您可以自动对请求进行身份验证 您可以选择使用文档存储凭据的最佳选项: 这很简单,但可能不是最好的方法。我也有同样的问题,我从服务器获得了一个Json数据,如下所示 {"error":0,"me
这很简单,但可能不是最好的方法。我也有同样的问题,我从服务器获得了一个Json数据,如下所示
{"error":0,"message":"ok","token":"7c75015e92e40511911e34752ee456e1","execute_time":"0.2723"}
因此,我将StuToken
保存在SharedReferences中,当我的应用程序启动时,检查StuToken
是否存在,如下所示
{"error":0,"message":"ok","token":"7c75015e92e40511911e34752ee456e1","execute_time":"0.2723"}
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();
}
}
Map loginInfo=InfoUtil.getLoginInfo(MainActivity.this);
if(loginInfo!=null){
if(loginInfo.get(“StuToken”)!=null){
getStuInfo(loginInfo.get(“StuToken”);
Toast.makeText(MainActivity.this,“登录状态", 吐司。长度(短)。show();
}否则{
initIntent(LoginActivity.class);
这个;
}
}否则{
initIntent(LoginActivity.class);
这个;
}
}
您可以使用共享首选项来存储用户的值,并检查用户是否已登录。您可以按照此操作处理一次性登录有很多方法,这在很大程度上取决于服务器端如何实现体系结构。通常登录API是e> 出于安全原因,紧密耦合。让我举例说明我所说的
紧密耦合
是什么意思
当你想登录
到移动应用
工作一次,并且下次用户打开移动应用
时,你不想再次用登录
屏幕提示用户。当然,你也不想将移动应用上的用户名
和密码
等机密信息保存为永久数据ta,因为它可以很容易地从android设备上获取。所以你要做什么呢
假设您使用Android设备特有的设备ID
传递登录凭据。如下所示。以下是发送到LoginAPI的JSON
数据
{
"username": "example@example.com",
"password": "it's not a secret",
"deviceId": "123456789"
}
现在,由于您不想保存登录
凭据,服务器将在您每次登录移动应用程序时生成一个随机字母数字字符串
传递给您作为响应
{
"Success": true,
"SuccessMessage": "credentials are correct, really!",
"ErrorMessage": null,
"Date": "dd/mm/yyyy",
"token": "1eghe4qha23aehraeh456789" // now this is a nasty String
}
您现在可以将移动应用程序中的日期
和令牌
保存为永久数据。
因此,下次用户打开应用程序时,您可以让用户绕过登录
屏幕,在后台,您可以通过将用户令牌id发送到服务器来检查该id是否正确,如下图所示。您可以选择或创建一个令牌id并将其保存在那里
{
"API_TYPE": "login",
"deviceId": "123456789",
"token": "1eghe4qha23aehraeh456789"
}
服务器可以对照设备id
检查此令牌id,以检查此令牌是否是设备的正确令牌,并作出响应
您可能会问,为什么我们要再次检查令牌
,因为这是由服务器首先发送的,说明凭据是正确的。我同意您有一点,比如说这是一个故障安全条件,如果用户从网站更改密码或导致更改服务器上的令牌以使该用户更改,如果服务器拒绝您提供的令牌,只要求用户再次登录
这将确保用户在任何给定的时间点只登录到一台Android设备。在您的SplashScreen活动中尝试此代码。您可以在SharedReference中存储一个值以检查用户是否登录
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();
}
}
您可以让您的API提供一个身份验证密钥,用于为将来的API请求对用户进行身份验证。您也可以设置此身份验证令牌的有效性。有关更多信息,请阅读JSON web令牌。如果在身份验证中使用密码,请记住在存储之前进行加密。感谢您的帮助,这似乎是我见过的最好的方法。我有但问题是,在设备上存储令牌太长时间不是一种坏做法吗?您是否建议用户在首次登录后每次返回应用时都采用以下方法:1.用户打开应用,共享首选项中存储的令牌和设备id将发送到服务器2.服务器验证设备id和令牌id以及存储在服务器上的设备id和令牌id……3.服务器然后生成一个新令牌,如果步骤2成功,它将发送一个新令牌以及成功消息4。然后在共享首选项中使用从服务器接收到的新令牌id更新令牌id。这是否过份?此外,您是否会关于通过ssl进行令牌检查的问题?@BenC,我注意到您实际上指出了此方法中的一些循环漏洞。您所建议的是可以完成的,ssl
选项也是如此。请记住,我添加了一个Date
密钥,该密钥将由服务器作为响应提供。此日期可用于检查n是最后一次成功进行登录
,您可以在10、20或30天后使令牌无效,并要求用户再次登录
,使用日期也是一个好主意,谢谢您的帮助。@BenC,不客气,很高兴与您交谈。