使用客户端凭据流的Android / IOS Secret过期管理

我想知道是否有任何策略来管理移动设备中的秘密到期。

在授权服务器允许移动客户端使用资源所有者密码流结合客户端凭证来授权他的情况下,客户端机密具有到期时间。

我已经看到有至少可以安全地存储Android应用程序秘密的方法,但是,如何在不发布应用程序新版本的情况下管理秘密过期?

这就是我们在OAuth刷新令牌标准之后在我们的应用程序中所做的工作。

第1步:您的API应该发送标准的Auth令牌响应,如此处所述

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响应创建的类的Object)

 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:再次进行Auth调用,并将grant_type设置为标准中所述的 refresh_token

步骤5:Auth调用应返回标准validation响应,如步骤1中所述,使用令牌刷新和新的refresh_token

我能想到的唯一方法是当你第一次运行应用程序连接到服务器并发送手机fingerPrint时,只有当fingerPrint没有在其数据库中列出时,服务器才会发送文件,该文件包含当前日期和此日期的数字签名,以便用户不会更改其值。 每次运行应用程序时,都可以通过应用VerifySignature方法检查日期和日期的完整性。