Ответ
Отзыв (revocation) access-токена — это процесс его принудительной инвалидации до истечения срока действия. Простое удаление токена на клиенте не является отзывом, так как сервер продолжит считать его валидным. Реальный отзыв всегда происходит на стороне сервера.
Существует несколько основных подходов:
1. Revocation Endpoint (OAuth 2.0)
Это стандартный механизм, описанный в RFC 7009. Сервер авторизации предоставляет специальный эндпоинт (например, /revoke), на который клиент может отправить запрос для отзыва токена.
Пример запроса:
import requests
# Данные для отзыва
TOKEN_TO_REVOKE = "some_access_token"
REVOKE_URL = "https://auth.example.com/revoke"
CLIENT_ID = "my-client"
CLIENT_SECRET = "my-secret"
response = requests.post(
REVOKE_URL,
auth=(CLIENT_ID, CLIENT_SECRET),
data={"token": TOKEN_TO_REVOKE, "token_type_hint": "access_token"}
)
if response.status_code == 200:
print("Токен успешно отозван.")
else:
print(f"Ошибка отзыва: {response.status_code}")
2. Черный список (Blacklisting) для JWT
Stateless-токены, такие как JWT, нельзя отозвать напрямую, так как они не хранятся на сервере. Решением является ведение «черного списка» отозванных токенов.
Как это работает:
- При выходе пользователя (logout) или компрометации токена его уникальный идентификатор (
jti) и время истечения (exp) добавляются в быстрое хранилище (например, Redis). - При каждом запросе с JWT сервер проверяет, не находится ли
jtiтокена в этом списке. - Записи из списка удаляются после истечения срока их действия (
exp), чтобы список не рос бесконечно.
3. Использование короткоживущих токенов
Этот подход не отзывает токен, а минимизирует ущерб от его утечки.
- Access-токены выпускаются с очень коротким сроком жизни (5-15 минут).
- Refresh-токены выпускаются на длительный срок (дни, недели) и используются для получения новой пары access/refresh токенов.
При выходе пользователя или компрометации отзывается только долгоживущий refresh-токен, а access-токен становится недействительным через несколько минут. Это наиболее распространенная и сбалансированная практика.