Какие существуют способы отзыва access-токена

Ответ

Отзыв (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, нельзя отозвать напрямую, так как они не хранятся на сервере. Решением является ведение «черного списка» отозванных токенов.

Как это работает:

  1. При выходе пользователя (logout) или компрометации токена его уникальный идентификатор (jti) и время истечения (exp) добавляются в быстрое хранилище (например, Redis).
  2. При каждом запросе с JWT сервер проверяет, не находится ли jti токена в этом списке.
  3. Записи из списка удаляются после истечения срока их действия (exp), чтобы список не рос бесконечно.

3. Использование короткоживущих токенов

Этот подход не отзывает токен, а минимизирует ущерб от его утечки.

  • Access-токены выпускаются с очень коротким сроком жизни (5-15 минут).
  • Refresh-токены выпускаются на длительный срок (дни, недели) и используются для получения новой пары access/refresh токенов.

При выходе пользователя или компрометации отзывается только долгоживущий refresh-токен, а access-токен становится недействительным через несколько минут. Это наиболее распространенная и сбалансированная практика.

Ответ 18+ 🔞

А, слушай, про отзыв токенов! Ну это ж классика, блядь. Вот представь: ты на клиенте этот токен удалил, думаешь — всё, делов-то. Ан нет, сука! На сервере-то он как был валидным, так и остался, этот кусок цифрового дерьма. Удалил — это не отозвал, ёпта. Настоящий отзыв — это когда сервер его в рот берунчик отправляет, принудительно.

Способы есть, конечно. Разной степени извращённости, блядь.

Первый, официальный такой, по учебнику. Эндпоинт /revoke, всё по белой схеме OAuth. Шлёшь туда токен — и ему пиздец. Вот прям как в коде:

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}")

Второй способ — для этих ваших модных JWT, которые «статлесс», блядь. Ага, статлесс, нихуя! А как его отозвать-то, умник? Он же самодостаточный, как хитрая жопа! Приходится заводить чёрный список, ёбта. При логауте кидаешь его jti (это типа ID токена) в Redis, и всё. Дальше при каждом запросе сервер смотрит: а не в бане ли этот красавец? Записи потом сами сдыхают, когда срок у токена выйдет — чтобы список до овердохуища не разросся.

Ну и третий, самый хитрый — короткоживущие токены. Это вообще, блядь, философия какая-то. Access-токен живёт 5-10 минут, как мушка однодневка, а refresh — долго. И если что-то пошло не так, отзываешь только этот долгоживущий refresh, а access сам сдохнет через пару минут. Ущерб минимальный, все довольны. Вообще, часто так и делают, пиздец как удобно.

Вот так вот, блядь. Удалить — это для галочки, а отозвать — это чтобы на сервере ему конкретно, в сраку, кирпич прилетел. Чувствуешь разницу?