ошибка 400 после успешного обновления токена Oauth 2 с использованием Retrofit2 / Kotlin в Android

#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 классе.

У меня это сработало.