android - 改造 - 处理刷新令牌过期
问题描述
当我的应用程序的访问令牌过期时,我使用刷新令牌通过 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 的实现。
在进行任何调用之前,您可以检查您是否仍然拥有有效的访问令牌,获取其到期时间并将其与来自
clock.getCurrentTimeMillis()
.万一访问令牌因其他原因无效(例如访问令牌可以手动撤销),您可以使用Okhttp 拦截器来响应 401。
如果访问令牌已过期或收到 401,您可以尝试使用您的刷新令牌刷新访问令牌。
如果刷新令牌不再有效,
/token
端点将返回以下错误:
HTTP/1.1 400 错误请求 { "error":"invalid_request" }
- 如果您收到该错误,您可以注销用户并向他发送应用程序的登录屏幕。
希望它可以帮助你。
推荐阅读
- git - 以编程方式获取 git 中的存储数量
- python - Python - 我如何使用 bs4 抓取 javascript 代码)?
- flutter - Returning multiple widgets at runtime
- php - curl --cert worl 很好,但是 php curl CURLOPT_CAPATH 不起作用
- mysql - Select rows from MySQL in the last 24 hours and skip rows based on interval X?
- django - Django Rest Framework模型视图集 - 在创建之前更新字段
- javascript - MissingSchemaError:尚未为模型“标记”注册模式
- python - 使用 LabelEncoder 转换日期
- java - 在 Gradle Spring Boot 项目中,如何声明依赖项仅在本地运行时使用?
- php - Call PHP constant by name vs number