#android #kotlin #retrofit2 #authenticator
#Android #kotlin #retrofit2 #аутентификатор
Вопрос:
Это код, который у меня есть для обновления токена в приложении Android с использованием kotlin ad retrofit 2.
gradle
:
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-moshi:retrofit:2.9.0"
И Authenticator
это :
class OAuthAuthenticator(
private val refreshTokenService: Repository,
private val sessionManager: SessionManager
) : Authenticator {
@Synchronized
override fun authenticate(route: Route?, response: Response): Request? {
try {
//synchronized call to refresh the token
val refreshTokenResponse =
refreshTokenService.refreshJWTToken(sessionManager.getAuthTokens())
val sessionDataResponseBody = refreshTokenResponse.body()
if (refreshTokenResponse.isSuccessful amp;amp; sessionDataResponseBody != null amp;amp; !sessionDataResponseBody.jwt.isNullOrEmpty()) {
sessionManager.jwtToken = sessionDataResponseBody.jwt
// retry request with the new tokens (I get 400 error)
return response.request()
.newBuilder()
.addHeader("Authorization", "Bearer ${sessionManager.jwtToken}")
.build()
} else {
throw HttpException(refreshTokenResponse)
}
} catch (throwable: Throwable) {
when (throwable) {
is HttpException -> {
onSessionExpiration()
return null
}
}
}
return null
}
private fun onSessionExpiration() {
sessionManager.clear()
}
}
Это Repository
класс :
object Repository {
fun refreshJWTToken(authTokens : AuthTokens) = RetrofitBuilder.userApi.getAuthenticationToken(authTokens).execute()
}
Это API
:
interface UserAPI {
@Headers("Cache-Control: no-cache")
@POST(AUTH_TOKENS_URL)
fun getAuthenticationToken(
@Header("Accept") accept : String,
@Header("Content-Type") contentType : String,
@Body params: AuthTokens
): Call<AuthTokenResponse>
}
retrofit builder
:
init {
val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val sessionManager = SessionManager.getInstance(context)
val httpLoggingInterceptor =
HttpLoggingInterceptor()
httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
httpClient = OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(ConnectivityCheckInterceptor(connectivityManager))
.addInterceptor(AuthInterceptor(sessionManager))
.authenticator(OAuth2Authenticator(UserRepository, sessionManager))
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
.build()
}
Вопрос :
Я могу подтвердить, что код обновляет токен аутентификации и успешно его сохраняет. Однако после этого я получаю ошибку 400. Есть предложения о том, что я делаю неправильно?
Ответ №1:
Я знаю, что этот вопрос устарел, но для всех, кто столкнулся с такой же проблемой, это была просто ошибка.
Пожалуйста, используйте header(..., ...)
вместо addHeader(..., ...)
в TokenAuthenticator
классе.
У меня это сработало.