• oidc
  • oauth
  • token-exchange
  • openid

Понимание обмена токенами в OAuth/OIDC

Обмен токенами — это расширение OAuth, позволяющее доверенным клиентам получать новые токены без взаимодействия с пользователем, что полезно для имперсонификации, автоматизации, интеграции между системами и миграции токенов в различных сценариях.

Sijie
Sijie
Developer

Введенный в RFC 8693, обмен токенами является расширением OAuth, позволяющим доверенным клиентам обменивать существующий токен на новый с различными атрибутами или областями. Этот механизм особенно полезен для сервиса, приложения или конечного пользователя, чтобы получить обычный токен доступа OAuth через предварительно авторизованный токен, без необходимости проходить полный поток OAuth.

Сравнение с потоком кода авторизации

Сначала давайте рассмотрим поток кода авторизации OAuth, который является самым распространенным потоком для получения токена доступа.

А это поток обмена токенами:

Перенаправление

Главное отличие в том, что в потоке кода авторизации клиентское приложение перенаправляет пользователя на сервер авторизации для получения токена доступа. В обмене токенами клиентское приложение может обменивать токен с сервером авторизации, не привлекая пользователя для перенаправления.

Это потому, что в потоке кода авторизации клиентское приложение не является "доверенным" и должно знать учетные данные пользователя для получения токена доступа. В обмене токенами клиентское приложение считается доверенным, поскольку уже получило токен от пользователя, и сервер авторизации проверит токен и выдаст новый.

Эмитент токенов и служба обмена токенами

В потоке обмена токенами "Auth Server" теперь представляет собой двух участников:

  1. Эмитент токенов: выпускает токен субъекта для клиентского приложения.
  2. Служба обмена токенами: проверяет токен субъекта и выдает новый токен для клиентского приложения.

Служба обмена токенами такая же, как "Auth Server" в потоке кода авторизации, а эмитент токенов может быть сторонним провайдером идентификации или выделен из "Auth Server" как специализированная служба.

Когда следует использовать обмен токенами?

Обмен токенами может выполняться без взаимодействия пользователя, что полезно в следующих сценариях:

  • Имперсонификация: Позволяет сервисам (например, бекенд микросервисы) или администраторам выполнять действия от имени пользователя без раскрытия полных учетных данных пользователя.
  • Автоматизация: Позволяет доверенным сервисам выполнять действия автоматически без ручного вмешательства или выполнять автоматизированное тестирование.
  • Интеграция с другими IdPs: Перевод токенов через различные системы идентификации для поддержания бесшовного пользовательского опыта и эффективного управления разрешениями, один из распространенных сценариев — перевод SSO токена в токен для downstream-сервиса.
  • Миграция: Перенос токенов с одного сервера авторизации на другой, например, с устаревшей системы на современную, совместимую с OAuth/OIDC.

Процесс обмена токенами

Обмен на новый токен доступа является самым распространенным случаем использования, мы возьмем это как пример. Обмен токенами не ограничен токеном доступа, он также может использоваться для выпуска других типов токенов, таких как токены обновления, ID токены и т.д.

Клиентское приложение

Для выполнения обмена токенами требуется зарегистрированное клиентское приложение с сервером авторизации.

При этом у клиентского приложения должен быть subject_token до инициирования потока обмена токенами, этот токен обычно предоставляется сервером авторизации или доверенным сторонним провайдером идентификации. Имея этот токен, клиентское приложение теперь считается "доверенным" для обмена токенами без необходимости в учетных данных пользователя и взаимодействии.

Запрос на обмен токенами

Клиент отправляет запрос на конечную точку токенов сервера авторизации для обмена существующего токена. Это включает subject_token (токен, который обменивается) и, возможно, желаемую целевую аудиторию, область действия и тип токена.

  1. grant_type: ОБЯЗАТЕЛЬНО. Значение этого параметра должно быть urn:ietf:params:oauth:grant-type:token-exchange, указывая, что выполняется обмен токенами.
  2. subject_token: ОБЯЗАТЕЛЬНО. Личный токен доступа пользователя.
  3. subject_token_type: ОБЯЗАТЕЛЬНО. Тип предоставленного в subject_token параметре защитного токена. Общим значением этого параметра является urn:ietf:params:oauth:token-type:access_token, но оно может варьироваться в зависимости от обмениваемого токена.
  4. resource: НЕОБЯЗАТЕЛЬНО. Индикатор ресурса, помогает указать целевой ресурс для токена доступа.
  5. audience: НЕОБЯЗАТЕЛЬНО. Аудитория токена доступа, указывающая предполагаемых получателей токена, сервер авторизации может использовать значение resource, если audience не указана.
  6. scope: НЕОБЯЗАТЕЛЬНО. Запрашиваемые области действия.

Также запрос должен включать информацию о клиенте, которая может быть закодирована в заголовке Basic Auth или отправлена в виде данных формы.

Вот пример запроса:

Обмен токенами в Logto

Logto поддерживает обмен токенами из коробки, включая имперсонификацию и личные токены доступа.