2016-11-15 114 views
1

我正在開發一個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_idclient_secret當前正在應用程序中進行硬編碼(儘管客戶端憑證授權並不打算在生產環境中啓用,因此仍然需要提供用戶名和密碼來檢索令牌)。

這裏最好的做法是什麼?

回答

1

我想我不能建議你如何在Java中編寫代碼,但我也在使用PHP創建應用程序時遇到了一些refresh_token問題,所以也許我的想法可以幫助你解決某些問題。

起初我一直在尋找從未到期的refresh_token(就像在Google API中一樣),所以我甚至可以對它進行硬編碼並使用,只要我想創建一個新的access_token。無論如何,在oAuth2中確實很難做到。所以我發現在這個問題上一個有趣的外觀在這裏:

Why do access tokens expire?

這表明我有點其他的方式與refresh_token工作。我已經設置了它生成的oAuth服務,並且每次使用refresh_token獲取新的access_token時都會返回一個新的refresh_token。這部分讓我最:

https://bshaffer.github.io/oauth2-server-php-docs/grant-types/refresh-token/

還有我們得到的東西,如:

$server = new OAuth2\Server($storage, array(
    'always_issue_new_refresh_token' => true, // this part 
    'refresh_token_lifetime'   => 2419200, 
)); 

在這種情況下,我有很長的活refresh_token,我可以在一些地方保存,當我需要它,我會使用它來獲得一個新的access_token,但是響應也會爲我提供一個新的refresh_token,我可以再次存儲它,並在稍後使用它來獲得一個新的access_token。

因此,在您的情況下,我認爲最好的方法是每次使用refresh_token要求access_token時繼續生成refresh_token。如果用戶不會長時間使用您的APP,我認爲他應該再次授權。

+0

感謝您的回覆!這或多或少是我最後實施的 –

相關問題