6.3. КОНЕЧНАЯ ТОЧКА АУТЕНТИФИКАЦИИ ПО ОТДЕЛЬНОМУ КАНАЛУ

6.3. КОНЕЧНАЯ ТОЧКА АУТЕНТИФИКАЦИИ ПО ОТДЕЛЬНОМУ КАНАЛУ

Настоящий стандарт определяет конечную точку аутентификации по отдельному каналу, которая используется для инициирования аутентификации конечного пользователя непосредственно у сервера авторизации путем отправки в нее запроса аутентификации от клиента. Передача сообщений между клиентом и сервером авторизации на конечной точке аутентификации по отдельному каналу должна производиться по аутентифицированному TLS-соединению в соответствии с требованиями к протоколу TLS, определенными в пункте 5.8.3 ФАПИ.СЕК. Взаимодействие AD с сервером авторизации и CD с клиентом AD в процессе аутентификации должно осуществляться с использованием протокола TLS.

6.3.1. Запрос аутентификации

Запрос аутентификации по отдельному каналу выполняется напрямую от клиента к серверу авторизации, без прохождения через браузер конечного пользователя. Клиент должен послать запрос аутентификации к серверу авторизации, создав запрос "HTTP POST", который предоставит всю необходимую информацию для аутентификации конечного пользователя без запроса его идентификационных данных.

Клиент аутентифицируется в конечной точке аутентификации по отдельному каналу зарегистрированным у сервера авторизации для его <client_id> методом, определенным в параметре <token_endpoint_auth_method> его метаданных. Методы аутентификации клиента регулируются требованиями обеспечения безопасности авторизации, применяемыми к серверу авторизации в зависимости от применяемого профиля безопасности OPENID API. При применении профиля безопасности для доступа к сервисам в режиме только для чтения допускается использование TLS с взаимной аутентификацией сторон взаимодействия протокола OAuth 2.0, <client_secret_jwt> или <private_key_WT> (подпункт 6.2.2.4 ФАПИ.СЕК). При применении профиля безопасности для доступа к сервисам в режиме чтения и записи допускается использование только TLS с взаимной аутентификацией сторон взаимодействия протокола OAuth 2.0 и <private_key_jwt> (подпункт 7.2.2.12 ФАПИ.СЕК).

При использовании TLS с взаимной аутентификацией сторон взаимодействия протокола OAuth 2.0 необходимо руководствоваться требованиями, определенными в пунктах 5.5.4 или 5.5.5 ФАПИ.СЕК.

При использовании механизмов аутентификации "client_secret_jwt" (пункт 5.5.2 ФАПИ.СЕК) и "private_key_jwt" (пункт 5.5.3 ФАПИ.СЕК) в параметре <client_assertion> в качестве заявленного значения аудитории (<aud>) следует использовать идентификатор эмитента сервера авторизации (параметр метаданных сервера авторизации <issuer> (подпункт 5.4.4.3 ФАПИ.СЕК)). Для обеспечения взаимодействия при запросе аутентификации сервер авторизации должен принимать данный идентификатор эмитента или URL конечной точки аутентификации по отдельному каналу в качестве значения, идентифицирующего его как целевую аудиторию (<aud>).

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

- <scope>: (обязательный) область действия, определяет свойства защищаемых данных конечного пользователя, к которым запрошен доступ. В случае использования протокола OpenID Connect параметр <scope> должен содержать строку "openid"; (подпункт 5.4.2.2 ФАПИ.СЕК). Параметр <scope> может содержать и другие значения, которые определяются на этапе разработки сервера авторизации исходя из его прикладных целей и задач.

Примечание. Дополнительные сведения об использовании параметра <scope> приведены в разделе 3.3 [RFC6749].

- <client_notification_token>: (обязательный, если клиент зарегистрирован для использования режимов Ping или Push) предоставляемый клиентом токен на предъявителя, который будет использоваться сервером авторизации для аутентификации выполняемого клиентом запроса обратного вызова. Длина токена не должна превышать 1024 символов, и он должен соответствовать синтаксису токена на предъявителя.

Примечание. Дополнительные сведения приведены в разделе 2.1 [RFC6750].

- <acr_values>: (опциональный) запрошенные значения класса контекста аутентификации. Разделенная пробелами строка, определяющая идентификаторы классов контекста аутентификации, отображаемые в порядке предпочтения, которые сервер авторизации запрашивает для обработки запроса аутентификации ([OpenID. Core] подпункт 5.5.1.1). Средства аутентификации конечного пользователя имплементируются сервером авторизации, и требуемый класс контекста аутентификации возвращается в качестве заявленного свойства <acr> ID токена. При наличии параметра <acr_values> в запросе аутентификации полученный ID токен должен содержать значение заявленного свойства <acr>.

Примечание. Используемые значения идентификаторов <acr> определяются участниками взаимодействия, использующими данное заявленное свойство и должны однозначно определять методы и факторы аутентификации [ГОСТ Р 58833-2020].

- <login_hint_token>: (опциональный) информация в виде токена, идентифицирующая конечного пользователя, для которого запрашивается аутентификация. Механизм формирования данного параметра определяется на этапе разработки сервера авторизации исходя из его прикладных целей и задач.

- <id_token_hint>: (опциональный) информация о пользователе в виде ID токена, ранее выданного клиенту сервером авторизации, в качестве рекомендации идентификации конечного пользователя.

- <login_hint>: (опциональный) информация о пользователе для сервера авторизации относительно конечного пользователя, для которого запрашивается аутентификация. Значение содержит идентификационные данные конечного пользователя, по которым сервер авторизации может однозначно его идентифицировать (адрес электронной почты, номер телефона, идентификатор субъекта), и может быть предварительно получено от конечного пользователя клиентом. Механизм формирования данного параметра определяется на этапе разработки сервера авторизации исходя из его прикладных целей и задач.

- <binding_message>: (опциональный) идентификатор или сообщение, предназначенные для отображения как на CD, так и на AD, чтобы связать их вместе для транзакции посредством визуальной информации для конечного пользователя. Это связывающее сообщение позволяет конечному пользователю убедиться, что действие, предпринятое на AD, связано с запросом, инициированным CD (например, код подтверждения транзакции). Поскольку различные устройства могут иметь ограниченные возможности отображения и сообщение предназначено для визуального просмотра конечным пользователем, значение <binding_message> должно включать не более 100 символов и использовать ограниченный набор символов в виде простого текста: алфавитно-цифровые символы "А - Я", "а - я", "A - Z", "a - z" и "0 - 9" и знаки "_", "!". Если предоставленное значение <binding_message> является неприемлемым, клиенту возвращается ошибка "invalid_binding_message".

- <user_code>: (опциональный) секретный код, известный только пользователю, но проверяемый сервером авторизации. Код используется для авторизации процесса отправки запроса аутентификации на AD пользователя. Этот параметр присутствует, если значение параметра метаданных клиента <backchannel_user_code_parameter> соответствует поддержке кода пользователя (имеет значение "true").

- <requested_expiry>: (опциональный) значение времени жизни для запроса аутентификации - положительное целое число, позволяющее ограничивать по времени и корректного завершать сессии аутентификации.

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

Поскольку в потоке аутентификации по отдельному каналу сервер авторизации не взаимодействует с конечным пользователем через CD, клиент должен указывать один из параметров, содержащих информацию о пользователе: <login_hint_token>, <id_token_hint> или <login_hint>.

Запрос аутентификации выполняется с использованием метода HTTP POST в формате "application/x-www-form-urlencoded" и кодировкой символов UTF-8 в теле объекта HTTP-запроса.

В случае аутентификации применения механизмов аутентификации "client_secret_jwt" (пункт 5.5.2 ФАПИ.СЕК) и "private_key_jw" (пункт 5.5.3 ФАПИ.СЕК) используются дополнительные параметры <client_assertion> и <client_assertion_type>.

Пример запроса аутентификации

POST /bc-authorize HTTP/1.1
Host: server.example.ru
Content-Type: application/x-www-form-urlencoded
scope=openid%20email%20example-scope&
client_notification_token=8d67dc78-7faa-4d41-aabd-67707b374255&
binding_message=W4SCT&
login_hint_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJHT1NUMzQxMCJ9. eyJzdWJfaWQiOnsic3Viam-VjdF90eXBlIjoicGhvbmUiLCJwaG9uZSI6Iis3MTIzMDAwMDAwMSJ9fQ.A9kJnX3IUAFHsic0nUfXKVNlGDWLuo2L80y2GLMsmn82xJ8yu6wA5k3pIepOUxrBd74aD_CVFHgJ3qVibjRBmawThhOQMNrgoqTGfR-NUWR8A9ogLogXHCSZEo7oCI1D4zxHhsDeSu0Mby61sLmr_uchscsEkSsfnKpmMpyaIn53wWdIu3OI5B-VMALm7EMZGuweReM5NTKfCUNjXNmp5w&
client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Ajwt-bearer&
client_assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJHT1NUMzQxMCJ9.eyJpc3MiOiJzNkJoZFJrcXQ-zIiwic3ViIjoiczZCaGRSa3F0MyIsImF1ZCI6Imh0dHBzOi8vc2VydmVyLmV4YW1wbGUucnUiLCJqdGki-OiJiZGMtWHNfc2YtM1lNbzRGU3pJSjJRIiwiaWF0IjoxNTkxMDc2NzE2LCJleHAiOjE1OTIwNzY3MTZ9. FuBj8SjN3bufQae1HgaO6BoSp4ocrnl4dnTZLJE0KZpnafAA88Ra7eoUT2QP1LHtetVAlDcT3nRJmyyRNL-c7oXTYtb5mqCbNYw4ThTm9hIgyV339hDO837vxX_GNzP6zY5nKA9nyqyRG3BbPldBkzanyQD1F0JtAVugnBZw

Декодированный login_hint_token

{
"sub_id": {
"subject_type": "phone",
"phone": "+71230000001"
}
}

Декодированный JWT параметр "client_assertion"

{
"iss": "s6BhdRkqt3",
"sub": "s6BhdRkqt3",
"aud": "https://server.example.ru",
"jti": "bdc-Xs_sf-3YMo4FSzIJ2Q",
"iat": 1591076716,
"exp": 1592076716
}

6.3.1.1. Подписанный запрос аутентификации

Подписанный запрос аутентификации создается посредством кодирования всех параметров запроса аутентификации в виде заявленных свойств подписанного JWT (подраздел 5.7 ФАПИ.СЕК), с представлением каждого наименования параметра запроса в качестве имени заявленного свойства (claim), а его значения - в виде строки JSON. Подписанный запрос аутентификации передается в качестве параметра "request" запроса "HTTP POST".

Примечание. Как исключение, параметры <requested_expiry> могут быть представлены также числом JSON.

При этом к JWT предъявляются следующие требования:

1) должен содержать все параметры запроса аутентификации;

2) быть защищенным асимметричной подписью (подпункт 5.8.1.2 ФАПИ.СЕК);

3) содержать следующие зарегистрированные заявленные свойства (claims):

- <aud>: аудитория, значение идентификатора эмитента сервера авторизации, который идентифицирует сервер авторизации как предполагаемую аудиторию;

- <iss>: источник, должен содержать идентификатор клиента;

- <exp>: время ограничения срока действия подписанного запроса аутентификации;

- <iat>: время создания подписанного запроса аутентификации;

- <nbf>: время, до которого подписанный запрос аутентификации недопустим;

- <jti>: уникальный идентификатор подписанного запроса аутентификации.

Пример подписанного запроса аутентификации

POST /bc-authorize HTTP/1.1
Host: server.example.ru
Content-Type: application/x-www-form-urlencoded
request=eyJ0eXAiOiJKV1QiLCJhbGciOiJHT1NUMzQxMCJ9. eyJpc3MiOiJzNkJoZFJrcXQzIiwiYX-VkIjoiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5ydSIsImV4cCI6MTUzNzgyMDA4NiwiaWF0IjoxNTM3O-DE5NDg2LCJuYmYiOjE1Mzc4MTg4ODYsImp0aSI6IjRMVENxQUNDMkVTQzVCV0NuTjNqNThFbkEiLCJzY-29wZSI6Im9wZW5pZCBlbWFpbCBleGFtcGxlLXNjb3BlIiwiY2xpZW50X25vdGlmaWNhdGlvbl90b2tlbiI6I-jhkNjdkYzc4LTdmYWEtNGQ0MS1hYWJkLTY3NzA3YjM3NDI1NSIsImJpbmRpbmdfbWVzc2FnZSI6Il-c0U0NUIiwibG9naW5faGludF90b2tlbiI6ImV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSkhUMU5VTX-pReE1DSjkuZXlKemRXSmZhV1FpT25zaWMzVmlhbVZqZEY5MGVYQmxJam9pY0dodmJtVWlMQ0p3YUc5dVpT-STZJaXMzTVRJek1EQXdNREF3TVNKOWZRLkE5a0puWDNJVUFGSHNpYzBuVWZYS1ZObEdEV0x1bzJMOD-B5MkdMTXNtbjgyeEo4eXU2d0E1azNwSWVwT1V4ckJkNzRhRF9DVkZIZ0ozcVZpYmpSQm1hd1RoaE9R-TU5yZ29xVEdmUk5VV1I4QTlvZ0xvZ1hIQ1NaRW83b0NJMUQ0enhIaHNEZVN1ME1ieTYxc0xtcl91Y2hzY3N-Fa1NzZm5LcG1NcHlhSW41M3dXZEl1M09JNUJWTUFMbTdFTVpHdXdlUmVNNU5US2ZDVU5qWE5tcDV3In0. LH3heoqfD18vh9ljE28NWKmKQWkztaXY2GBMzDePM9yMz5L2vdvuTQ_5p9c6szleZBwYwEcxUv4P9uqIvF6zX-8Mt_qXY1sGomG1x33EwbtKdqYqFjtAwE1FVHLOEA
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3A
&client-assertion-type%3Ajwt-bearer
&client_assertion=eyJ0eXAiOiJKV1QiLCJhbGciOiJHT1NUMzQxMCJ9.eyJpc3MiOiJzNkJoZFJrcXQ-zIiwic3ViIjoiczZCaGRSa3F0MyIsImF1ZCI6Imh0dHBzOi8vc2VydmVyLmV4YW1wbGUucnUiLCJqdGki-OiJiZGMtWHNfc2YtM1lNbzRGU3pJSjJRIiwiaWF0IjoxNTkxMDc2NzE2LCJleHAiOjE1OTIwNzY3MTZ9.
FuBj8SjN3bufQae1HgaO6BoSp4ocrnl4dnTZLJE0KZpnafAA88Ra7eoUT2QP1LHtetVAlDcT3nRJmyyRNL-c7oXTYtb5mqCbNYw4ThTm9hIgyV339hDO837vxX_GNzP6zY5nKA9nyqyRG3BbPldBkzanyQD1F0JtAVugnBZw

Декодированный JWT параметра "request"

{
"iss": "s6BhdRkqt3",
"aud": "https://server.example.ru",
"exp": 1537820086,
"iat": 1537819486,
"nbf": 1537818886,
"jti": "4LTCqACC2ESC5BWCnN3j58EnA",
"scope": "openid email example-scope",
"client_notification_token": "8d67dc78-7faa-4d41-aabd-67707b374255",
"binding_message": "W4SCT",
"login_hint_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJHT1NUMzQxMCJ9.eyJzdWJfaWQiOnsic3Viam-VjdF90eXBlIjoicGhvbmUiLCJwaG9uZSI6Iis3MTIzMDAwMDAwMSJ9fQ.A9kJnX3IUAFHsic0nUfXKVN-lGDWLuo2L80y2GLMsmn82xJ8yu6wA5k3pIepOUxrBd74aD_CVFHgJ3qVibjRBmawThhOQMNrgoqTGfR-NUWR8A9ogLogXHCSZEo7oCI1D4zxHhsDeSu0Mby61sLmr_uchscsEkSsfnKpmMpyaIn53wWdIu3OI5BV-MALm7EMZGuweReM5NTKfCUNjXNmp5w"
}

6.3.1.2. Код пользователя

Поток аутентификации по отдельному каналу в качестве механизма предотвращения создания нежелательных запросов аутентификации на AD конечного пользователя поддерживает использование параметра <user_code> - код пользователя, секрет конечного пользователя, известный серверу авторизации.

Примечание. Запрещено использовать в качестве <user_code> пароль учетной записи конечного пользователя, зарегистрированной у сервера авторизации.

При поддержке параметра <user_code> сервером авторизации клиент запрашивает у конечного пользователя значение кода пользователя для снятия риска создания запросов на аутентификацию для конечного пользователя третьими лицами, знающими <login_hint> или другие идентификаторы конечного пользователя. В случае использования нестатичных <login_hint> сервер авторизации может принимать запросы без <user_code>.

Сервер авторизации объявляет о поддержке кода пользователя значением параметра метаданных <backchannel_user_code_parameter_supported>. Параметр регистрации клиента <backchannel_user_code_parameter> указывает, поддерживает ли клиент параметр <user_code>.

Клиент запрашивает у конечного пользователя код пользователя для каждого потока аутентификации и не должен хранить его.

Механизм регистрации пользователем <user_code> на сервере авторизации выходит за рамки содержания настоящего стандарта. Сервер авторизации определяет механизм регистрации исходя из его прикладных целей и задач, а также должен предоставлять пользователю возможность изменения значения <user_code>.

6.3.2. Проверка запроса аутентификации

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

1. Аутентифицировать клиента зарегистрированным для него методом аутентификации (пункт 5.5.1 ФАПИ.СЕК).

2. Если запрос аутентификации подписан, проверить переданный параметром "request" JWT на корректность его структуры и подписи (подраздел 5.7 ФАПИ.СЕК).

3. Проверить наличие всех обязательных параметров в запросе аутентификации.

4. Проверить значения параметров. Если запрос содержит более одного или ни одного указания на пользователя (<login_hint_token>, <id_token_hint> или <login_hint>), сервер авторизации возвращает ответ об ошибке "invalid_request".

5. Проверить предоставленную информацию о пользователе на корректность состава параметров и актуальность связанного с ним конечного пользователя, а в случае применения подписанного указания (<id_token_hint> или <login_hint_token>) проверить его подпись. Механизм проверки информации о пользователе и способы извещения клиента о требованиях к ней определяются на этапе разработки сервера авторизации исходя из его прикладных целей и задач.

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

Сервер авторизации должен игнорировать нераспознанные параметры запроса. При непрохождении проверки запроса аутентификации сервер авторизации возвращает ответ об ошибке (подраздел 6.8).

6.3.3. Успешное подтверждение запроса аутентификации

Если запрос аутентификации подтвержден, сервер авторизации вернет клиенту ответ HTTP "200 OK", содержащий следующие параметры:

- <auth_req_id>: (обязательный) уникальный идентификатор запроса аутентификации от клиента. Должен быть случайным и содержать достаточную энтропию (минимум 160 бит). Необходимо использовать символы "A" - "Z", "a" - "z", "0" - "9", ".", "-" и "_" для поддержки unpadded base64url. Значение идентификатора не должно указывать клиенту на связь с другими данными или иметь смысловую нагрузку.

- <expires_in>: (обязательный) JSON с положительным целочисленным значением, указывающим время истечения действия <auth_req_id> в секундах с момента получения запроса аутентификации. Клиенту возвращается ответ об ошибке в случае обращения к конечной точке токена с истекшим идентификатором <auth_req_id>.

- <interval>: (опциональный) JSON с положительным целочисленным значением, указывающим минимальное количество времени в секундах, которое клиент ожидает между запросами на опрос к конечной точке токена. Указывается, если клиент зарегистрирован для использования режимов Poll или Ping. Если значение не указано, клиент использует значения по умолчанию "5".

Пример ответа на запрос аутентификации

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"auth_req_id": "1c266114-a1be-4252-8ad1-04986c5b9ac1",
"expires_in": 120,
"interval": 2
}

6.3.4. Проверка положительного ответа на запрос аутентификации

При получении в ответе аутентификации значения HTTP "200 OK" клиент проверяет наличие требуемых параметров и сохраняет значение <auth_req_id> для проверки обратных вызовов, полученных в режимах Ping и Push, или для запроса токена в режимах Poll и Ping, а также сохраняет значение <expires_in> для удаления запросов аутентификации, по которым не получены ответы в обратных вызовах Ping или Push.

6.3.5. Получение сервером авторизации согласия/авторизации конечного пользователя

После того как сервер авторизации проверил запрос аутентификации, он идентифицирует конечного пользователя, выбирает способ аутентификации и авторизации запроса в соответствии с запрашиваемым методом и инициирует интерактивную сессию с AD конечного пользователя (подпункт 5.4.2.7 ФАПИ.СЕК). Как только конечный пользователь аутентифицирован, сервер авторизации должен получить результат авторизации запроса о согласии передавать информацию клиенту (подпункт 5.4.2.8 ФАПИ.СЕК).