【发布时间】:2020-11-07 01:14:02
【问题描述】:
我正在尝试使用 Authenticator 来处理 401 响应。我所做的是
fun provideAccessTokenAuthenticator(
mainApiServiceHolder: MainApiServiceHolder,
preferences: SharedPreferences
) = object : Authenticator {
override fun authenticate(route: Route?, response: Response): Request? {
val accessToken = preferences.getString(ACCESS_TOKEN, null)
if (!isRequestWithAccessToken(response) || accessToken == null) {
return null
}
synchronized(this) {
val newAccessToken = preferences.getString(ACCESS_TOKEN, null)!!
// Access token is refreshed in another thread.
if (accessToken != newAccessToken) {
return newRequestWithAccessToken(response.request, newAccessToken)
}
// Need to refresh an access token
val refreshTokenResponse = runBlocking {
Log.d("zzzzzzzzzz", "refresh token is running")
mainApiServiceHolder.mainApiService?.refreshToken(
"refresh_token",
preferences.getString(REFRESH_TOKEN, null)!!,
AuthRepository.CLIENT_ID,
AuthRepository.CLIENT_SECRET
)
}
Log.d("zzzzzzzzzz", refreshTokenResponse?.body()?.access_token!!)
return if (refreshTokenResponse?.isSuccessful!!) {
Log.d("zzzzzzzzzz", "refresh token is successful")
newRequestWithAccessToken(
response.request,
refreshTokenResponse.body()?.access_token!!
)
} else {
Log.d("zzzzzzzzzz", "refresh token is unsuccessful")
response.request.newBuilder().header("Content-Type", "application/json").build()
}
}
}
现在,当有 401 响应时会调用它。刷新令牌调用也被触发(从日志)。但是,它永远不会在 refreshTokenResponse 中得到结果,之后什么也没有发生。我认为这是使用 runBlock 的错误方式。该api是
@FormUrlEncoded
@POST("/api/auth/token/")
suspend fun refreshToken(
@Field("grant_type") grant_type: String,
@Field("refresh_token") refresh_token: String,
@Field("client_id") client_id: String,
@Field("client_secret") client_secret: String
): Response<LoginResponse>
任何帮助将不胜感激。谢谢
【问题讨论】:
标签: android retrofit2 okhttp kotlin-coroutines