如何在 android 中调用 REST API 之前刷新 JWT 令牌? (改造,接收)

How to refresh the JWT token before calling the REST API in android? (Retrofit, Rx)

我正在使用 Kotlin、RxJava(RxKotlin)、Retrofit 开发 android 应用程序。

我们的服务使用 JWT 令牌。

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

但我的问题是...

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

例如5个API个请求并发到MainActivity中的服务器

如果令牌已经过期,我将收到 5 个错误,其中包含 401 http 错误代码(令牌已过期)。

但在我的例子中,我检查令牌是否过期。

如果token过期了,我尝试刷新token。

所以在这个例子中,我发送了 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.

中更改刷新令牌登录