改装-处理刷新令牌到期

时间:2019-04-15 11:37:22

标签: android oauth retrofit retrofit2 okhttp

当我的应用程序的访问令牌过期时,我使用刷新令牌通过Authenticator类获取新的访问令牌。

我的代码如下:

if (response.code() == 401) {
   Log.d("refresh", "Access token expired")
   val webservice: Webservice = RetrofitClient.makeRetrofitService().create(Webservice::class.java)
   var refreshToken = PreferenceData.getUserLoggedInRefreshToken(App.GetContext()!!)
   var map = generateRequestBody(mapOf("refreshToken" to refreshToken!!))
   var refreshResponse = webservice.refreshToken(map).execute()

   if (refreshResponse != null && refreshResponse.code() == 200) {
      Log.d("refresh", "New access token received")
      var newToken = (refreshResponse.body() as UserLogin).token
      var refreshToken = (refreshResponse.body() as UserLogin).refreshToken
      PreferenceData.setUserLoggedInAccessToken(App.GetContext()!!, newToken)
      PreferenceData.setUserLoggedInRefreshToken(App.GetContext()!!, refreshToken)

      return response.request().newBuilder()
      .header("Authorization", "Bearer $newToken")
      .build();
    }
}

到目前为止,一切都很好。 我现在想做的是当我的刷新令牌过期时,我想将用户重定向到应用程序的登录屏幕。但是我的问题是,当我打电话时

var refreshResponse = webservice.refreshToken(map).execute()

服务器还返回401。所以我的问题是我无法确定我收到的401是由于访问令牌已过期还是刷新令牌已过期。解决此问题的最合适方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以查看AppAuth-Android的实现。

  1. 在进行任何呼叫之前,您可以check that you still have a valid access token,获取其到期时间并将其与SpingGenericEventPublisher的结果进行比较。

  2. 只要访问令牌由于其他原因无效(例如,访问令牌可以手动吊销),您就可以使用Okhttp Interceptor来响应401s。

  3. 如果访问令牌已过期或获得401,则可以尝试refresh the access token with your refresh token

  4. 如果刷新令牌不再有效,则clock.getCurrentTimeMillis()端点将返回following error

  

HTTP / 1.1 400错误的请求{“错误”:“ invalid_request”}

  1. 如果遇到该错误,则可以注销用户并将其登录屏幕发送给他。

希望它对您有帮助。