Показать/Скрыть содержание

    Авторизация с использованием двухфакторной аутентификации

    В силу того, что двухфакторная аутентификация на ЦИ требует интерактивного взаимодействия с пользователем, сценарий протокола OAuth с утверждениями типа Resourceowner не может быть выполнен для пользователей, которым назначен второй фактор аутентификации.

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

    Примечание

    Для использования данного сценария в настройках Oauth-клиента необходимо разрешить сценарий Confirmation. Пример команды:

    Set-IdsClient ... -AllowedFlow Confirmation ...

    Шаг 1. Формирование запроса к ЦИ на инициализацию процедуры аутентификации

    Для инициирования процедуры двухфакторной аутентификации необходимо сформировать запрос к ЦИ, включающий в себя идентификатор ресурса и базовые аутентификационные данные пользователя (логин/пароль).

    Пример запроса

    POST https://{{hostname}}/{{instanceName}}/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-запроса клиент должен указать логин и пароль пользователя.

    В запросе необходимо указать:

    • ChoiceSelected.RefID – Идентификатор выбранного метода подтверждения транзакции
    • RefId – Идентификатор транзакции, созданной на Сервисе Операций (пункт 2.1).
    • Resource – Идентификатор Сервиса Подписи в формате urn:cryptopro:dss:signserver:<signserver app name> (по умолчанию имеет значение urn:cryptopro:dss:signserver:signserver).
    POST https://{{hostname}}/{{instanceName}}/confirmation HTTP/1.1
    Authorization: Basic VGVzdDE6VGVzdDFUZXN0MQ==
    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://{{hostname}}/{{instanceName}}/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
    }
    
    В начало © ООО "КРИПТО-ПРО", 2000–2025