我想知道是否有任何策略来管理移动设备中的秘密到期。
在授权服务器允许移动客户端使用资源所有者密码流结合客户端凭据对他进行授权的情况下,客户端机密具有到期时间。
我已经看到至少有一些方法可以在 Android 应用程序上安全地存储机密,但是,您如何在不发布新版本的应用程序的情况下管理机密过期?
我想知道是否有任何策略来管理移动设备中的秘密到期。
在授权服务器允许移动客户端使用资源所有者密码流结合客户端凭据对他进行授权的情况下,客户端机密具有到期时间。
我已经看到至少有一些方法可以在 Android 应用程序上安全地存储机密,但是,您如何在不发布新版本的应用程序的情况下管理机密过期?
这就是我们在应用程序中遵循OAuth 刷新令牌标准的方式。
第 1 步:您的 API 应该发送标准的 Auth Token Response,如此处所述
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
第 2 步:将该响应保存在共享首选项/本地缓存/本地数据库中,我们使用共享首选项(假设accountToken
是从 Auth Token 的响应创建的类的对象)
SharedPreferences.Editor editor = getContext().getSharedPreferences("AUTH_PREFS_NAME", Context.MODE_PRIVATE).edit();
editor.putString("AUTH_ACCESS_TOKEN_KEY", accountToken.getAccess_token());
editor.putString("AUTH_REFRESH_TOKEN_KEY", accountToken.getRefresh_token());
editor.putLong("AUTH_EXPIRES_IN_KEY", accountToken.getExpires_in());
editor.putLong("AUTH_TIME_SAVED_KEY", ((int) (System.currentTimeMillis() / 1000)));
editor.commit();
第 3 步:每次您必须使用保存的访问令牌时,请确保它没有过期
public boolean needsTokenRefresh(String accessToken) {
if (accessToken == null || accessToken.length() == 0) {
// no access token to refresh. Don't refresh.
return false;
}
SharedPreferences pref = mContext.getSharedPreferences("AUTH_PREFS_NAME", Context.MODE_PRIVATE);
String refreshToken = pref.getString("AUTH_REFRESH_TOKEN_KEY", null);
if (refreshToken == null || refreshToken.length() == 0) {
// no refresh token. Can't refresh.
return false;
}
Integer timeSaved = pref.getInt("AUTH_TIME_SAVED_KEY", 0);
if (timeSaved == 0) {
// No recording of having saved the token. Don't refresh.
return false;
}
long expiresIn = pref.getLong("AUTH_EXPIRES_IN_KEY", 0);
int now = (int) (System.currentTimeMillis() / 1000);
int timePassed = Math.abs(now - timeSaved);
boolean expired = false;
if (expiresIn <= timePassed) {
expired = true;
}
return expired;
}
如果needsTokenRefresh()
返回false
,则使用保存的 Auth Token。如果它返回true
,则转到下一步。
第 4 步:使用标准中所述的grant_type
设置再次进行 Auth 调用refresh_token
第 5 步:身份验证调用应返回标准身份验证响应,如第 1 步中所述,令牌已刷新和新refresh_token
我能想到的唯一方法是当您第一次运行该应用程序连接到服务器并发送手机指纹时,只有当指纹未在其数据库中列出时,服务器才会发送文件,该文件包含当前日期以及该日期的数字签名,因此用户不会更改其值。每次运行应用程序时,您都会通过应用验证签名方法检查日期和日期的完整性。