Цикл проверки подлинности OkHttp после успешного запроса токена обновления - PullRequest
0 голосов
/ 20 сентября 2018

Я реализовал расширение класса okhttp3.Authenticator вместе с Retrofit 2 для обработки 401 ошибок в моем приложении для Android.Он должен вызвать запрос refreshToken, а затем, если он завершится успешно, вызвать требуемый запрос с новым токеном доступа.Проблема в том, что после успешного получения токена обновления мой TokenAuthenticator ... обновляет токен снова и снова, пока не будет достигнут некоторый предел.Есть ли у вас какие-либо подсказки, что происходит?

Класс TokenAuthenticator:

class TokenAuthenticator : Authenticator {

    private val notLoggedResponseCode = 401
    private val successResponseCode = 200
    private val refreshTokenGrantType = "refresh_token"

    override fun authenticate(route: Route?, response: okhttp3.Response?): Request? {

        if (response?.code() == notLoggedResponseCode) {

            val refreshTokenResponse: Response<Authorization> = RestController
                    .getInstance()
                    .basicRetrofit
                    .create(AuthRepository::class.java)
                    .refreshToken(
                            Credentials.basic(BuildConfig.CLIENT_ID, BuildConfig.CLIENT_SECRET),
                            refreshTokenGrantType,
                            UserSession.getInstance().authorization?.refreshToken!!)
                    .execute()



            return if (refreshTokenResponse.code() == successResponseCode) {
                UserSession.getInstance().authorization = refreshTokenResponse.body() //updating token
                UserSession.getInstance().saveAuthorizationData()

                // Every time flow is here, so new access token is obtained.
                // But somehow it starts refresh procedure again... 
                response
                        .request()
                        .newBuilder()
                        .build()
            } else {
                null
            }
        } else {
            return null
        }
    }
}

Метод инициализации клиента OkHttp для модернизации:

    private fun initBaseOkHttpClientBuilder(): OkHttpClient.Builder {
        val logging = HttpLoggingInterceptor().apply {
            this.level = HttpLoggingInterceptor.Level.BODY
        }

        return OkHttpClient.Builder()
                .connectTimeout(connectionTimeout, TimeUnit.SECONDS)
                .readTimeout(connectionTimeout, TimeUnit.SECONDS)
                .writeTimeout(connectionTimeout, TimeUnit.SECONDS)
                .addInterceptor(logging)
                .authenticator(TokenAuthenticator())
                .addInterceptor(OAuth2Interceptor())
    }

1 Ответ

0 голосов
/ 20 сентября 2018

Когда вы получаете токен обновления, вам нужно передать его в новый запрос в заголовке.Что-то вроде response.request().newBuilder().header("Authorization", "bearer " + bearer).build()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...