微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Android中调用REST API之前刷新JWT令牌? 改装,Rx

如何解决如何在Android中调用REST API之前刷新JWT令牌? 改装,Rx

我正在使用Kotlin,RxJava(RxKotlin),翻新版开发Android应用。

我们的服务使用JWT令牌。

在发送REST API之前刷新过期的令牌并不难。

但是我的问题是...

某些UI同时调用多个REST API。

例如,在MainActivity中将5个API请求同时发送到服务器。

如果令牌已过期,我将收到5个带有401 http错误代码错误(令牌已过期)。

但是对于我来说,我检查令牌是否已过期。

如果令牌已过期,我会尝试刷新令牌。

因此,在此示例中,我发送了5个刷新令牌的请求。

然后...我将获得5个新的JWT令牌...

我更好的主意是...

在发送5个REST请求之前,我可以检查令牌是否已过期。

但是问题是...我有很多这种UI。

所以我需要一种更漂亮的方法

我认为这种代码(在UI中发送请求之前检查令牌)可以解决我的问题。

但是这个代码是多余的,样板代码...

我想只用一个入口就能解决这个问题。

我为自己的愚蠢英语技能感到非常抱歉。

解决方法

您可以集中处理这种情况。 OkHttpClient有一个称为authenticator()的方法。当任何响应获得未经授权的异常时,将调用它。下面是一个示例(我在这里使用kotlin):

OkHttpClient.Builder()
    .authenticator(object: Authenticator {
        override fun authenticate(route: Route?,response: Response): Request? {
            if(response.code == 401) {
                // build retrofit client manually and call refresh token api
                val refreshTokenService = retrofitClient.create(RefreshTokenService::class.java)
                val refreshTokenResponse = refreshTokenService.refreshToken().execute()
                val token = refreshTokenResponse.body().token
                return response.request.newBuilder().header("Authorization",token).build()
            } else {
                return response.request
            }                
        }
    })

将此客户添加到改造中。您必须在此authenticator中更改刷新令牌登录。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。