Авторизация и обновление токена
Вопрос
Расскажи, как ты реализуешь авторизацию по токенам в Android-клиенте, включая обновление токена.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.