翻新-句柄刷新令牌到期 [英] Retrofit - Handle refresh token expiration

查看:40
本文介绍了翻新-句柄刷新令牌到期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我的应用的访问令牌过期时,我使用刷新令牌通过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是由于访问令牌过期还是由于刷新令牌过期。处理此问题最合适的方法是什么?

谢谢!

推荐答案

您可以查看AppAuth-Android实现。

  1. 在进行任何调用之前,您可以check that you still have a valid access token,获取其过期时间,并将其与clock.getCurrentTimeMillis()的结果进行比较。

  2. 仅在访问令牌由于其他原因无效(例如,可以手动吊销访问令牌)的情况下,您可以使用Okhttp Interceptor来响应401。

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

  4. 如果刷新标记不再有效,/token端点将返回following error

HTTP/1.1 400错误请求{&Q;错误&Q;:&Q;INVALID_REQUEST&Q;}

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

希望它能帮助您。

这篇关于翻新-句柄刷新令牌到期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆