8.1. РЕЖИМ ОТВЕТА НА ОСНОВЕ JWT

8.1. РЕЖИМ ОТВЕТА НА ОСНОВЕ JWT

В данном разделе стандарта определяется основанный на токенах JWT режим кодирования параметров ответов на запросы авторизации. Все параметры ответов данного типа передаются в JWT вместе со вспомогательными полями, используемыми для дополнительной защиты передачи. Существуют разные способы кодирования самого токена JWT в ответе клиенту, а именно в качестве параметра запроса <URI>, фрагмента полного URI <fragment> либо одного из значений скрипта автоматически обрабатываемой формы <form post>, и в данном разделе определен набор значений режима ответа, соответствующих этим способам кодирования.

Примечание. Дополнительные сведения о кодировании ответа на запрос авторизации OAuth 2.0 представлены в документе [42].

8.1.1. Структура данных JWT-ответа

8.1.1.1. JWT (подраздел 5.7) содержит следующие базовые параметры, используемые для обеспечения безопасности передачи:

- <iss>: URL сервера авторизации, который создал ответ,

- <aud>: <client_id> клиента, для которого предназначен ответ,

- <exp>: окончание срока действия JWT.

Кроме того, JWT содержит параметры ответа конечной точки авторизации, определенные для конкретных типов ответов даже в случае ответа об ошибке. Этот шаблон применим ко всем типам ответов. В последующих подразделах иллюстрируется шаблон с типами ответов "code" и "token".

Примечание. В JWT также добавляются дополнительные параметры ответа конечной точки авторизации, определяемые расширениями, например <session_state> в соответствии с [43].

8.1.1.2. Тип ответа "code"

В случае если разрешение на авторизацию имеет тип "code", JWT содержит параметры <code> и <state>, определенные в подпункте 5.4.2.8.

Следующий пример демонстрирует параметры компоненты <payload> токена JWT для успешного значения <code> ответа на запрос авторизации:

{
"iss":"https://accounts.example.com",
"aud":"s6BhdRkqt3",
"exp":1311281970,
"code":"PyyFaux2o7Q0YfXBU32jhw.5FXSQpvr8akv9CeRDSd0QA",
"state":"S8NJ7uqk5fY4EjNvP_G_FtyJu6pUsvH9jsYni9dMAJw"
}

В случае ответа об ошибке JWT будет содержать параметры ответа об ошибке, <error>, <error_description>, <error_URI>, <state>, определенные в подпункте 5.4.2.9.

Следующий пример демонстрирует содержимое токена JWT для такого сообщения об ошибке:

{
"error":"access_denied",
"state":"S8NJ7uqk5fY4EjNvP_G_FtyJu6pUsvH9jsYni9dMAJw"
}

8.1.1.3. Тип ответа "token"

В случае если сгенерированное сервером авторизации разрешение, подтверждающее факт авторизации доступа к конфиденциальному ресурсу его владельцем, имеет тип "token", JWT содержит следующие параметры ответа:

- <access_token> - токен доступа,

- <token_type> - тип токена доступа,

- <expires_in> - окончание срока действия токена доступа,

- <scope> - область действия, предоставляемая токеном доступа,

- <state> - значение состояния, отправленное клиентом в запросе авторизации.

Следующий пример показывает параметры JWT для успешного ответа типа "token" на запрос авторизации:

{
"iss":"https://accounts.example.com",
"aud":"s6BhdRkqt3",
"exp":1311281970,
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"state":"S8NJ7uqk5fY4EjNvP_G_FtyJu6pUsvH9jsYni9dMAJw",
"token_type":"bearer",
"expires_in":"3600",
"scope":"example"
}

В случае ответа об ошибке JWT содержит параметры ответа об ошибке, как в случае типа ответа "code".

8.1.2. Цифровая подпись и шифрование

JWT может быть либо подписан (JWS), либо подписан и зашифрован (JWS и JWE). Если JWT подписан и зашифрован, JSON документ будет подписан, затем зашифрован, а результатом будет Nested JWT.

Сервер авторизации определяет, какой алгоритм использовать для обеспечения защиты JWT для конкретного ответа на запрос авторизации. Это решение может быть основано на зарегистрированных параметрах метаданных для клиента, как определено в подразделе 8.2.

Рекомендации по управлению ключами в целом и в особенности по использованию симметричных алгоритмов для подписи и шифрования на основе ключа клиента см. в пункте 5.8.1.

8.1.3. Кодирование ответа

Настоящий стандарт определяет следующие значения параметра <response_mode> в составе запроса аутентификации:

- "query.jwt",

- "fragment.jwt",

- "form_post.jwt",

- "jwt".

8.1.3.1. Режим ответа "query.jwt" заставляет сервер авторизации отправлять ответ на запрос авторизации в виде HTTP переадресации на URI переадресации (<redirect_URI>) клиента. Сервер авторизации добавляет параметр <response>, содержащий JWT, как определено в пункте 8.1.1, к компоненту <query> <redirect_URI>, используя формат "application/x-www-form-urlencoded".

Примечание. Режим ответа "query.jwt" не должен использоваться в сочетании с типами ответов, которые содержат "token" или "id_token", если JWT ответа не зашифрован для предотвращения утечки токена в URL.

8.1.3.2. Режим ответа "fragment.jwt" заставляет сервер авторизации отправлять ответ на запрос авторизации как HTTP переадресацию на URI переадресации (<redirect_URI>) клиента. Сервер авторизации добавляет параметр <responses>, содержащий JWT, как определено в пункте 8.1.1, к компоненту <fragment> <redirect_URI>, используя формат "application/x-www-form-urlencoded".

8.1.3.3. Режим ответа "form_past.jwt". Параметр <response>, содержащий JWT, кодируется как значение HTML-формы, которое автоматически передается в агент пользователя и, таким образом, доставляется клиенту с помощью метода HTTP POST, а параметры результата кодируются в теле с использованием формата "application/x-www-form-urlencoded".

Примечание. Общие сведения по использованию метода POST для передачи JWT клиенту представлены в документе "OAuth 2.0 Form Post Response Mode" [44].

8.1.3.4. Режим ответа "jwt" является ссылкой и указывает на формат включения JWT в URI переадресации по умолчанию (<query> либо <fragment>) для запрошенного типа ответа. Значением по умолчанию для типа ответа "code" является "query.jwt", для типа ответа "token" и других типов ответов, за исключением "none", - "fragment.jwt".

8.1.4. Правила обработки

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

Клиент должен обрабатывать защищенный с помощью JWT ответ следующим образом:

1 (опционально) клиент расшифровывает JWT, используя ключ, определенный параметром заголовка <kid> полученного JWT. Ключ может быть закрытым ключом, соответствующий открытый ключ которого зарегистрирован ожидаемым отправителем ответа ("use:enc" в метаданных клиента <jwks> или <jwks_URI>), или ключом, полученным из ключа клиента (см. пункт 8.1.2);

2 клиент получает значение параметра JWT <state> и проверяет его привязку к агенту пользователя. Если проверка не пройдена, клиент должен прервать обработку и отказать в ответе;

3 клиент получает параметр JWT <iss>, проверяет, известно ли ему это значение, и идентифицирует ожидаемого отправителя текущей сессии авторизации. Если проверка не пройдена, клиент должен прервать обработку и отказать в ответе;

4 клиент получает параметр JWT <aud> и проверяет, соответствует ли он идентификатору клиента, который использовал клиент для идентификации себя в соответствующем запросе авторизации. Если проверка не пройдена, клиент должен прервать обработку и отказать в ответе;

5 клиент проверяет параметр JWT <exp>, чтобы определить, действителен ли еще JWT. Если проверка не пройдена, клиент должен прервать обработку и отказать в ответе;

6 клиент получает ключ, необходимый для проверки подписи, используя элемент JWT <iss> и элемент заголовка <kid>, после чего проверяет подпись. Если проверка не пройдена, клиент должен прервать обработку и отказать в ответе.

Значение <state> обрабатывается как одноразовый CSRF-токен. Он должен быть объявлен недействительным после осуществления проверки (шаг 2).

Получение клиентом ключей для проверки подписи JWT (шаг 5) должно выполняться в соответствии с алгоритмами подпункта 5.8.1.3.

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