【问题标题】:How to refresh the JWT token before calling the REST API in android? (Retrofit, Rx)如何在android中调用REST API之前刷新JWT令牌? (改造,Rx)
【发布时间】:2020-12-02 06:59:31
【问题描述】:

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

我们的服务使用 JWT 令牌。

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

但我的问题是……

部分 UI 会同时调用多个 REST API。

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

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

但就我而言,我会检查令牌是否过期。

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

所以在这个例子中,我发送了 5 个刷新令牌的请求。

那么...我将获得 5 个新的 JWT 令牌...

我更好的主意是……

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

但问题是……我有很多这样的用户界面。

所以我需要一个更漂亮的方式。

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

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

我想通过一个入口来解决这个问题。

我真的很抱歉我愚蠢的英语技能。

【问题讨论】:

  • 您是否在改造实例中添加了任何OkHttpClient
  • @shafayathossain,当然这是强制性的,对吧?

标签: android kotlin jwt retrofit rx-java


【解决方案1】:

您可以集中处理这种情况。 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 中更改刷新令牌登录。

【讨论】:

  • 您的答案是最佳答案!但它不能解决我的问题。因为我们的服务使用错误代码 460 而不是 401。但是我可以从您的回答中找到提示。我使用拦截器解决了这个问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-02-16
  • 2020-12-26
  • 2018-09-13
  • 2021-03-11
  • 2021-02-16
  • 1970-01-01
  • 2022-08-06
  • 2020-09-20
相关资源
最近更新 更多