Ответ вслух Senior Сеть: Retrofit и OkHttp обновлено

Авторизация и обновление токена

Вопрос

Расскажи, как ты реализуешь авторизацию по токенам в Android-клиенте, включая обновление токена.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Access-токен добавляю в каждый запрос через application interceptor, который читает его из хранилища. Когда сервер отвечает 401, OkHttp вызывает Authenticator: в нём я обновляю токен по refresh-токену и возвращаю исходный запрос с новым заголовком.

Что должно прозвучать в ответе

  • Access-токен в заголовке через application interceptor

  • При 401 Authenticator обновляет токен и повторяет запрос

  • Ограничение повторов, чтобы не зациклиться

  • Синхронизация при параллельных 401, проверка что токен уже обновлён

  • Refresh отдельным клиентом без аутентификатора

  • Хранение токенов: DataStore с шифрованием ключом из Keystore, разлогин при неудаче refresh

Что могут спросить следом

  • Почему refresh нельзя делать тем же клиентом?
  • Где хранить refresh-токен?
  • Что делать с запросами, пока идёт refresh?

Разбор

Access-токен добавляю в каждый запрос через application interceptor, который читает его из хранилища. Когда сервер отвечает 401, OkHttp вызывает Authenticator: в нём я обновляю токен по refresh-токену и возвращаю исходный запрос с новым заголовком. Чтобы не зациклиться, считаю попытки по цепочке priorResponse и после второй возвращаю null. Главная тонкость это параллельные запросы: если пять запросов одновременно получили 401, обновлять должен один. Делаю критическую секцию и внутри сравниваю токен из упавшего запроса с текущим: если его уже обновил другой поток, просто повторяю запрос. Сам refresh-запрос иду через отдельный клиент без аутентификатора, иначе 401 на refresh вызовет рекурсию. Если refresh не удался, чищу токены и отправляю пользователя на вход. Токены храню в DataStore, шифруя их ключом из Android Keystore.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.