我正在開發一個Android應用程序,它使用Oauth2令牌來獲取授權以訪問受保護的資源。我使用第三方平臺作爲身份驗證服務器(使用OpenId Connect)。基本上我的問題是,我想處理過期的刷新令牌。Android中的Oauth2刷新令牌續訂
目前的情況
我有一個NetUtils
類的行爲像一個單身和管理使用安全模板休息我所有的請求。該剩餘模板使用請求包裝爲每個請求注入所需的授權標頭。 NetUtils
類處理whith令牌和超時,將它們保存在用戶首選項中,並在需要時刷新它們。
但是,刷新令牌本身到期時會出現問題。在我使用授權碼流時,我需要打開一個WebView並將用戶重定向到登錄頁面,但是當NetUtils類確定刷新令牌已過期時,我會注意到它。理想情況下,應用程序將啓動WebView,用戶將再次登錄並執行存儲的請求。這是我的代碼,以刷新訪問令牌:
private AccessToken refreshToken(String idClient, String clientSecret, AccessToken accessToken) {
MultiValueMap<String, String> clientAuthenticationForm = new LinkedMultiValueMap<>();
clientAuthenticationForm.add("grant_type", "refresh_token");
clientAuthenticationForm.add("refresh_token", accessToken.getRefreshToken());
clientAuthenticationForm.add("client_id", idClient);
clientAuthenticationForm.add("client_secret", clientSecret);
try {
long lastClientRefresh = mPrefs.getLong(Preferences.LAST_LOGIN_TIME, Long.MIN_VALUE);
boolean refreshTokenExpired = lastClientRefresh
+ TimeUnit.SECONDS.toMillis(accessToken.getRefreshExpiresIn()) < System
.currentTimeMillis();
if (!refreshTokenExpired) {
return regularRestTemplate
.postForEntity(tokenUrl(), clientAuthenticationForm, AccessToken.class)
.getBody();
}else{
//How to cope with this?
return null;
}
} catch (Exception ex) {
Log.e(TAG, ex.getMessage(), ex);
throw ex;
}
}
其他選擇
其他的選擇是讓刷新令牌長期居住並刷新每個應用程序啓動,例如時間。我不得不提及client_id和client_secret當前正在應用程序中進行硬編碼(儘管客戶端憑證授權並不打算在生產環境中啓用,因此仍然需要提供用戶名和密碼來檢索令牌)。
這裏最好的做法是什麼?
感謝您的回覆!這或多或少是我最後實施的 –