Как провести различие между различными ответами Retrofit в Аутентификаторах или Перехватчиках? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть базовая c Retrofit настройка для сетевых запросов. У меня есть следующее Authenticator, которое добавляется в цепочку. Он в основном пытается обновить sh токен доступа при возникновении ошибки авторизации (401).

class TokenAuthenticator(private val api: MyApi) : Authenticator {

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

        val retrofitResponse = api.refreshAccessToken("my refresh token here"))
        val refreshResponse= retrofitResponse.blockingGet()

        return if(refreshResponse != null) {
                     response.request().newBuilder()
                        .header(Const.HEADER_AUTHORIZATION, "Bearer " + refreshResponse.accessToken)
                        .build()
            } else {
                return null
            }

    }
}

Проблема в том, что мой сервер может вернуть 401 не только для проблем с авторизацией, но и для некоторых других случаев. Например, я могу получить ответ с 401, если номер телефона пользователя уже существует в базе данных. Сервер возвращает мне error_code параметр, чтобы различать проблемы этого типа:

  • error_code = "token_expired" -> проблема авторизации. показывает, что токен доступа истек.

  • error_code = "phone_exists" -> показывает номер телефона, который уже введен в базу данных.

Итак, мне нужно иметь возможность проверить этот параметр, прежде чем решить, что ошибка была ошибкой токена доступа refre sh. Как я могу это сделать?

В настоящее время, так как я не смог проверить этот параметр, мое приложение считает, что 401 - это проблема с авторизацией, и постоянно пытается обновить sh токен доступа, даже если мой токен доступа не истек.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Вы имеете в виду ErrorInterceptor?

import okhttp3.Interceptor
import okhttp3.Response

class ErrorInterceptor: Interceptor {

    override fun intercept(chain: Interceptor.Chain?): Response {

        val originalResponse = chain!!.proceed(chain.request())

        if (shouldLogout(originalResponse)) {
            // your logout logic here

            // send empty response down the chain
            return Response.Builder().build()

        }
        return originalResponse
    }

    private fun shouldLogout(response: Response) : Boolean {
        if (response.isSuccessful) {
            return false
        }

        // 401 and auth token means that we need to logout
        return (response.code() == 401 &&
                !response.headers().names().contains(AUTH_HEADER_KEY))
    }
}
0 голосов
/ 24 февраля 2020

у нас была похожая проблема в нашем проекте, это может быть небольшая путаница из-за жестко запрограммированного URL, но я думаю, что это хорошо

мы проверяем URL запроса и, если он совпадает с refre sh URL токена, после чего мы начинаем процесс получения нового токена

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