You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit+OkHttp中Token刷新流程无响应的问题求助

Retrofit+OkHttp中Token刷新流程无响应的问题求助

我现在在Android项目里用Retrofit和OkHttp实现token刷新机制,但遇到了一个棘手的问题:拦截器能检测到401 Unauthorized响应,也能获取到refresh token,但后续的token刷新请求完全没执行,日志只打到了"Refresh token exists!"就没下文了。

下面是我的TokenInterceptor代码:

class TokenInterceptor(private val context: Context) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val originalRequest = chain.request()
        val accessToken = PreferenceUtil(context).getAccessToken()
        Log.d("ApiClient", "Current token: $accessToken")

        // Add access token to header if it exists
        val requestWithToken = if (accessToken != null) {
            originalRequest.newBuilder()
                .header("Authorization", "Bearer $accessToken")
                .build()
        } else {
            originalRequest
        }

        // Send request
        var originalResponse = chain.proceed(requestWithToken)

        if (originalResponse.code == 401) {
            // Refresh token request
            Log.e("ApiClient", "Token expired error, ${originalResponse.code}")

            val refreshToken = PreferenceUtil(context).getRefreshToken()
            Log.d("ApiClient", "Refresh token: $refreshToken")

            if (refreshToken != null) {
                Log.d("ApiClient", "Refresh token exists!")

                // Asynchronous task to request a new access token
                val newAccessToken = runBlocking {
                    reissueToken(refreshToken)
                    Log.d("ApiClient", "Why is this not working?")
                }

                newAccessToken?.let {
                    Log.d("ApiClient", "Replacing with new refresh token!")

                    val newRequest = originalRequest.newBuilder()
                        .header("Authorization", "Bearer $it")
                        .build()

                    originalResponse = chain.proceed(newRequest)
                }
            }
        }

        return originalResponse
    }

    private suspend fun reissueToken(refreshToken: String): String? {
        return withContext(Dispatchers.IO) {
            val apiService = ApiClient.getInstance(context).create(LogInService::class.java)
            val response = apiService.reissueToken(refreshToken)
            Log.d("ApiClient", "Receiving new response: ${response}")

            if (response.isSuccessful) {
                Log.d("ApiClient", "Response successful")

                response.body()?.let { tokenResponse ->
                    Log.d("ApiClient", "Token successfully renewed")
                    PreferenceUtil(context).setAccessToken(tokenResponse.accessToken)
                    PreferenceUtil(context).setRefreshToken(tokenResponse.refreshToken)
                    return@withContext tokenResponse.accessToken
                }
            } else {
                Log.d("ApiClient", "Response failed...")
                null
            }
        }
    }
}

项目里相关的代码结构:

  • ApiClient:负责初始化Retrofit实例,配置OkHttpClient时添加了这个TokenInterceptor
  • TokenInterceptor:核心拦截逻辑,先给请求附加access token,收到401响应时尝试调用刷新接口获取新token

目前打印的日志只有这些:

"Current token: $accessToken"
"Token expired error, 401"
"Refresh token: $refreshToken"
"Refresh token exists!"

完全看不到reissueToken方法里的日志,刷新请求根本没触发,有没有大佬能帮我看看问题出在哪?

备注:内容来源于stack exchange,提问作者onyuuu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:08:00