Может ли Retrofit помочь с просроченным токеном сделать запрос

«Может ли Retrofit помочь с просроченным токеном сделать запрос» — вопрос из категории Сети, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Retrofit сам по себе не обрабатывает просроченные токены, но можно использовать Interceptor для автоматического обновления токена при 401 ошибке.

Пример:

class AuthInterceptor(private val tokenManager: TokenManager) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer ${tokenManager.getToken()}")
            .build()

        val response = chain.proceed(request)

        if (response.code == 401) {
            val newToken = tokenManager.refreshToken() // синхронный запрос
            val newRequest = request.newBuilder()
                .header("Authorization", "Bearer $newToken")
                .build()
            return chain.proceed(newRequest)
        }
        return response
    }
}

Важно:

  • Обновление токена должно быть синхронным внутри intercept().
  • Учитывайте возможные рекурсии (если refresh-токен тоже протух).
  • Лучше добавить механизм блокировки параллельных обновлений токена.