改造 - 处理刷新令牌过期

Leo*_*hen 2 android oauth retrofit okhttp retrofit2

当我的应用程序的访问令牌过期时,我使用刷新令牌通过 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

服务器也返回 401。所以我的问题是我不知道我收到的 401 是由于访问令牌已过期还是刷新令牌已过期。处理这个问题最合适的方法是什么?

谢谢!

Dav*_*uel 7

您可以查看AppAuth-Android实现。

  1. 在进行任何调用之前,您可以检查您是否仍然拥有有效的访问令牌,获取其过期时间并将其与来自clock.getCurrentTimeMillis().

  2. 以防万一访问令牌由于其他原因无效(例如可以手动撤销访问令牌),您可以使用Okhttp 拦截器来响应 401。

  3. 如果访问令牌已过期或者您收到 401,您可以尝试使用您的刷新令牌刷新访问令牌

  4. 如果刷新令牌不再有效,/token端点将返回以下错误

HTTP/1.1 400 错误请求 { "error":"invalid_request" }

  1. 如果您收到该错误,您可以注销用户并将应用程序的登录屏幕发送给他。

希望对你有帮助。