Авторизация с использованием двухфакторной аутентификации
В силу того, что двухфакторная аутентификация на ЦИ DSS требует интерактивного взаимодействия с пользователем, сценарий протокола OAuth с утверждениями типа Resourceowner не может быть выполнен для пользователей, которым назначен второй фактор аутентификации.
В случае, если таких пользователей необходимо авторизовать, следует использовать описанный ниже сценарий.
Шаг 1. Формирование запроса к ЦИ на инициализацию процедуры аутентификации
Для инициирования процедуры двухфакторной аутентификации необходимо сформировать запрос к ЦИ, включающий в себя идентификатор ресурса и базовые аутентификационные данные пользователя (логин/пароль).
Пример запроса
POST https://host/STS/confirmation HTTP/1.1
Content-Type: application/json
Authorization: Basic VGVzdDE6VGVzdDFUZXN0MQ==
{
"Resource":"urn:cryptopro:dss:signserver:signserver",
"ClientId":"oauth-client-id",
"ClientSecret":"oauth-client-secret"
}
Примечание
Логин и пароль пользователя передаются в заголовке Authorization
в виде Basic BASE64(Login:Password)
, где BASE64
- функция кодирования строки в формат BASE64, Login и Password - логин и пароль пользователя соответственно.
E.g: Логин: Test1, Пароль: Test1Test1, значение заголовка - Basic VGVzdDE6VGVzdDFUZXN0MQ==
.
В случае, если пароль у пользователя отсутствует, заголовок должен иметь значение Basic BASE64(Login:)
.
ClientId
- идентификатор OAuth клиента.ClientSecret
- пароль OAuth клиента (для неконфиденциальных клиентов данный параметр не указывается).
В зависимости от количества подключенных способов подтверждения операций возможно два варианта ответа на запрос:
- Если у Пользователя подключен один метод подтверждения операций, то при успешном выполнении запроса он получит одноразовый пароль на указанный номер мобильного телефона (Пример ответа 1).
- Если у Пользователя подключено несколько методов подтверждения операций, то при успешном выполнении запроса он получит доступные методы подтверждения операции (Пример ответа 2). В этом случае необходимо выбрать метод подтверждения операции.
В ответ на этот запрос ЦИ пришлет приглашение к вводу информации по второму фактору аутентификации (формат зависит от выбранного метода аутентификации)
Далее, на примере вторичной аутентификации по СМС будут приведены примеры запросов и ответов от ЦИ.
Пример ответа 1
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"Challenge": {
"Title": {
"Value": "На ваш номер отправлено SMS сообщение с одноразовым паролем"
},
"TextChallenge": [
{
"AuthnMethod": "http://dss.cryptopro.ru/identity/authenticationmethod/otpviasms",
"RefID": "82d2cd39-81e1-4a59-904c-93047006cd95",
"Label": "Подтвердите операцию входа пользователя. Идентификатор запроса ngwcoyyy",
"MaxLenSpecified": false,
"HideTextSpecified": false,
"ExpiresIn": 300,
"ExpiresInSpecified": true
}
],
"ContextData": {
"RefID": "82d2cd39-81e1-4a59-904c-93047006cd95"
}
},
"IsFinal": false,
"IsError": false
}
Пример ответа 2
Необходимо запомнить идентификатор транзакции RefID для выбора метода ее подтверждения в пункте 2.1.1.
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 6736
Content-Type: application/json; charset=utf-8
Expires: -1
{
"Challenge": {
"Title": {
"Value": "Для подтверждения операции необходимо выбрать способ аутентификации"
},
"ChoiceChallenge": [
{
"Choice": [
{
"RefID": "http://dss.cryptopro.ru/identity/authenticationmethod/otpviasms",
"Label": "Аутентификация с помощью СМС"
},
{
"RefID": "http://dss.cryptopro.ru/identity/authenticationmethod/mobile",
"Label": "Аутентифкация c помощью мобильного приложения"
}
],
"RefID": "7406c54e-0ba5-4340-bbaa-3c2feebdc852",
"Label": "Для подтверждения операции необходимо выбрать способ аутентификации",
"ExactlyOne": true,
"ExactlyOneSpecified": true,
"ExpiresIn": 86400,
"ExpiresInSpecified": true
}
],
"ContextData": {
"RefID": "7406c54e-0ba5-4340-bbaa-3c2feebdc852"
}
},
"IsFinal": false,
"IsError": false
}
POST-запрос на выбор метода подтверждения транзакции (только если подключено несколько методов подтверждения)
В заголовке Authorization HTTP-запроса клиент должен указать AccessToken
, полученный при аутентификации:
Authorization: Bearer \<access_token>
В запросе необходимо указать:
ChoiceSelected.RefID
– Идентификатор выбранного метода подтверждения транзакцииRefId
– Идентификатор транзакции, созданной на Сервисе Подтверждения Операций (пункт 2.1).Resource
– Идентификатор Сервиса Подписи в формате urn:cryptopro:dss:signserver:<signserver app name> (по умолчанию имеет значение urn:cryptopro:dss:signserver:signserver).
POST https://host/STS/confirmation HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJHM ... 5aPB98A3NAVduJbtz5Wti-H8CeXycwB6A
Content-Type: application/json; charset=utf-8
Host: host
Content-Length: 246
Expect: 100-continue
{
"Resource" : "urn:cryptopro:dss:signserver:signserver",
"ClientId":"oauth-client-id",
"ClientSecret":"oauth-client-secret",
"ChallengeResponse" : {
"ChoiceChallengeResponse" : [ {
"RefId" : "49744464-5cd7-419d-891e-2495b8f49539",
"ChoiceSelected": [{
"RefID": "http://dss.cryptopro.ru/identity/authenticationmethod/otpviasms",
}]
} ]
}
}
Пример ответа
При успешном выполнении запроса Пользователь должен получить на свой номер мобильного телефона одноразовый пароль.
Необходимо запомнить новый идентификатор транзакции RefID
для ее подтверждения в пункте 2.2.
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 6736
Content-Type: application/json; charset=utf-8
Expires: -1
{
"Challenge": {
"Title": {
"Value": "Код подтверждения отправлен на ваш номер мобильного телефона"
},
"TextChallenge": [
{
"AuthnMethod": "http://dss.cryptopro.ru/identity/authenticationmethod/otpviasms",
"RefID": "5460867e-be6a-4940-bebc-9aeb516fa448",
"Label": "02.11.2018 9:47:05. Подпись документа. testPdf.pdf. Идентификатор операции gcoaryoy. Пользователь Test2. Сертификат: test2.",
"MaxLenSpecified": false,
"HideTextSpecified": false,
"ExpiresIn": 86400,
"ExpiresInSpecified": true
}
],
"ContextData": {
"RefID": "5460867e-be6a-4940-bebc-9aeb516fa448"
}
},
"IsFinal": false,
"IsError": false
}
Примечание
RefId
- Идентификатор транзакции, созданной на Сервисе Подтверждения Операций.
Его необходимо будет использовать при следующем обращении на конечную точку /confirmation (пункт 2.2).
Шаг 2. Формирование ChallengeResponse и получение маркера безопасности
Следующим этапом является формирование объекта Challenge Response, включающего в себя данные для вторичной аутентификации (например, QR-code, одноразовый пароль и т.п.).
Формат данных зависит от выбранного метода вторичной аутентификации и информацию о нем можно получить в соответствующих разделах документации.
Пример запроса
POST https://host/STS/confirmation HTTP/1.1
Authorization: Basic VGVzdDE6VGVzdDFUZXN0MQ==
Content-Type: application/json
{
"Resource" : "urn:cryptopro:dss:signserver:signserver",
"ClientId":"oauth-client-id",
"ClientSecret":"oauth-client-secret",
"ChallengeResponse":
{
"TextChallengeResponse":
[{
"RefId":"ccb39b68-acd4-437f-9eef-563738987011",
"Value":"62985"}
]
}
}
Если были переданы корректные аутентификационные данные, ЦИ в ответе вернет маркер безопасности:
Пример ответа
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"AccessToken": "eyJ0eXAiOiJKV1QiLCJh...",
"ExpiresIn": 600,
"IsFinal": true,
"IsError": false
}