使用客户端凭据流的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方法检查日期和日期的完整性。
- 使用Appcelerator Titanium(或同等版本)的缺点?
- iOS可以接收像Android一样的广播吗?
- HTML 5video自动播放function检测
- 处理DateTime的最有效方法是什么,特别是因为DATETIME列导致了NUMERIC?
- 科多瓦当地通知声音不工作在ios和andorid
- 通过GCM推送安静通知到Android / IOS
- 有没有任何API或方法来获取您的应用程序内的WhatsApp聊天消息
- 在官方Meteor for Windows上创build移动应用程序的最简单的方法
- 在Android SDK SDK 4.1+中调用Android refreshCurrentAccessTokenAsync