【问题标题】:how to refresh Bearer Token using retrofit android Kotlin如何使用改造 android Kotlin 刷新 Bearer Token
【发布时间】:2022-11-24 03:58:57
【问题描述】:

虽然登录应用程序我可以获得令牌、刷新令牌并保存它,但我不知道令牌的会话何时结束如何更新。如何在其中添加拦截器以更新令牌或可以使用其他一些方法?这是我的代码

1- API端点

@POST("identity/Identity/GetRefreshToken")
suspend fun refreshToken(): AuthTokenEntityDT0

2- AuthTokenEntityDT0 响应

data class AuthTokenEntityDT0(
@SerializedName("accessToken") val accessToken: String,
@SerializedName("refreshToken") val refreshToken: String,
@SerializedName("statusCode") val statusCode: Int,
@SerializedName("statusMessage") val statusMessage: String,
)

3 - 在这里提出请求

@Provides
@Singleton
fun provideAPIService(): ApiService {
   val interceptor = HttpLoggingInterceptor()
   interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
   val client: OkHttpClient = OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .addInterceptor { chain ->
                val original = chain.request()
                val requestBuilder = original.newBuilder()
                .addHeader("Content-Type", "application/json; charset=UTF-8")
                .addHeader("user-agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36")
                .addHeader("Authorization", "Bearer $access_token")
                val request = requestBuilder.build()
                chain.proceed(request)
            }
            .build()


        val retrofit = Retrofit.Builder()
            .baseUrl(NativeBaseUrl.getBaseUrl())
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        return retrofit.create(ApiService::
        class.java)
    }


    @Provides
    fun provideApiRepository(apiService: ApiService): ApiRepository {
        return ApiRepositoryImpl(apiService)
    }

【问题讨论】:

  • 好吧,获得令牌做得很好,你已经完成了一半。至于令牌何时过期,这取决于您使用的后端服务。从概念上讲,令牌告诉后端服务您的调用有效,您已通过身份验证。一旦您的访问或刷新令牌过期,您将收到 HTTP 401 或 403(这实际上取决于后端系统)任何经过身份验证的调用都可能导致此代码 - 让您知道您需要更新令牌。
  • @Marton 非常感谢您的帮助,我正在寻找以编程方式实现的帮助,例如,在 15 个 mint 令牌过期后,我得到了响应代码 401,如何实现拦截器以获取错误 401 并更新令牌,感谢任何建议,谢谢
  • 您的代码走在正确的轨道上,您已经添加了自定义拦截器。你知道如何获得新令牌吗?后端服务应该采用某种机制,您可以在其中传递 accesToken 以换取 refreshToken。

标签: android kotlin retrofit okhttp


【解决方案1】:

我建议您将自定义拦截器放在它自己的类中,如下所示:

class ForbiddenInterceptor : Interceptor {
    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        val request: Request = chain.request()
        val response: Response = chain.proceed(request)
        if (response.code == 401) {
            // this code section will run for every HTTP 401 response
        }
        return response
    }
}

然后使用这个拦截器:

val client: OkHttpClient = OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .addInterceptor(ForbiddenInterceptor())
            .build()

将拦截器添加到 OkHttpClient 确保您将拦截调用并且您可以运行自定义代码,检查它是否已被服务器拒绝。

至于更新你的令牌。您可能需要实现后端的另一项服务。我只能假设,但您必须使用您的 accesToken 将其输入端点,服务器将返回一个新的 refreshToken

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 2019-05-02
    • 2022-11-24
    • 2020-05-10
    • 2015-12-31
    • 2023-02-02
    相关资源
    最近更新 更多