RFC 7009 — Отзыв токенов — Versola Docs
/docs
До 1.00.7.5versola.ioGitHub

RFC 7009 — Отзыв токенов

Отзыв токенов OAuth 2.0 — что делает POST /revoke с refresh и access token и где отозванный access token перестает работать.

Спецификация: RFC 7009

Через отзыв токенов клиент сообщает authorization server, что токен больше не нужен. Versola принимает и refresh, и access token; дальнейшее поведение для них различается, как описано в списках ниже.

Статус

Реализован. Отмечено пунктов: 17 из 20.

Endpoint

  • Endpoint POST /revoke (раздел 2); другие методы отклоняются
  • Тело запроса application/x-www-form-urlencoded; запрос без token отклоняется с invalid_request

Типы токенов

  • Отзыв refresh token — токен сразу удаляется и больше не обменивается, а все access token, выданные тем же grant, отзываются (см. ниже)
  • Отзыв access token — принимается; отзыв отправляется на back-channel endpoint клиента, и с этого момента edge отклоняет токен
  • Отклонение отозванного access token самим auth — не реализовано: /introspect и /userinfo продолжают принимать токен до его истечения
  • Тип токена определяется по формату (JWT — access token, все остальное — refresh token)
  • token_type_hint принимается и игнорируется, что RFC допускает (RevocationSpec)
  • unsupported_token_type — никогда не возвращается; значение, которого не мог держать ни один клиент, получает ответ 200

Где перестает работать отозванный access token

  • На back_channel_logout_uri клиента приходит подписанное событие versola:event:access-token-revocation, называющее токен (revoked_jti) или все семейство refresh token (revoked_fam) вместе с revoked_exp
  • edge сохраняет отзыв в таблице revocations и отклоняет токен до его exp на всех репликах (см. Edge; TokenRevocationFlowSpec)
  • Клиент без back_channel_logout_uri — ничего не отправляется, поэтому отозванный access token остается действительным до истечения; /revoke все равно отвечает 200

Аутентификация клиента

  • Аутентификация клиента обязательна в каждом запросе (раздел 2.1), в том числе для значения, которого не мог держать ни один клиент
  • client_secret_basic и client_secret_post
  • private_key_jwt (RFC 7523)
  • tls_client_auth и self_signed_tls_client_auth (RFC 8705)
  • invalid_client с HTTP 401 при неудачной аутентификации (RevocationSpec)
  • Публичный клиент аутентифицируется одним client_id, кроме тенанта fapi2, который такое отклоняет

Поведение ответа

  • HTTP 200 при успехе (раздел 2.2)
  • HTTP 200 для неизвестных, уже отозванных или некорректных токенов (RevocationSpec)
  • Клиент не может отозвать токен другого клиента — invalid_client (RevocationSpec)

Примечания

  • Access token — подписанные JWT, которых auth не записывает, поэтому отзыв — это уведомление, а не изменение состояния внутри auth. Resource server, проверяющим подпись локально, нужна проверка edge или подписка на событие back channel, чтобы узнать об отзыве.
  • Отзыв refresh token называет семейство токенов, а не отдельные access token, и ограничивает запись текущим TTL access token клиента.

Куда смотреть

Справочник OpenAPI содержит спецификацию отзыва, а Edge объясняет кеш отзывов, который отклоняет отозванные access-токены.