Авторизация с использованием кода авторизации
Примечание
Данный сценарий требует интерактивного взаимодействия Пользователя с Веб-интерфейсом ЦИ DSS.
Спецификация описана в разделе 4.1 RFC6749.
Получение доступа к функциям КриптоПро DSS посредством протокола OAuth с типом разрешения Authorization Code может быть представлено следующей схемой:
- Запрос авторизации
- Авторизация пользователя
- Выдача кода авторизации
- Запрос маркера доступа
- Получение маркера доступа
Запрос авторизации
Для инициации запроса на авторизацию клиентское приложение должно сформировать следующий запрос и отправить его на конечную точку /oauth/authorize:
Пример
GET https://{{hostname}}/{{stsappname}/oauth/authorize?client_id=sample&response_type=code&scope=dss&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob%3Aauto&resource=urn:cryptopro:dss:signserver:signserver
accept-encoding: gzip, deflate
Connection: close
Параметры запроса:
client_id
- идентификатор клиента OAuth, зарегистрированный на ЦИ DSS. Для регистрации клиента и его последующей конфигурации можно воспользоваться командлетами Windows PowerShell Add-DssClient и Set-DssClient соответственно.
Примечание
При регистрации клиента параметр AllowedFlow
должен содержать значение AuthorizationCode
.
response_type
- в данном сценарии имеет значениеcode
.scope
- области использования маркера. Должен содержать значение dss.redirect_uri
- зарегистрированный на Центре Идентификации адрес возврата (по этому адресу будет возвращен запрошенный код авторизации).
Примечание
Значение параметра должно соответствовать значению адреса возврата, заданного при регистрации клиента на ЦИ.
Для случаев, в которых не планируется использование выделенного HTTP-сервиса для обработки URI перенаправления, рекомендуется использовать зарезервированный URI urn:ietf:wg:oauth:2.0:oob:auto
.
resource
- идентификатор ресурса, для доступа к которому выпускается токен. Для Сервиса Подписи идентификатор фиксирован и имеет вид urn:cryptopro:dss:signserver:<signserverAppName>.
Аутентификация пользователя
В ответ на запрос ЦИ может перенаправить пользователя на страницу аутентификации. Процесс аутентификации может занять несколько шагов и состоять из множества перенаправлений на другие ресурсы.
Выдача кода авторизации
После успешной аутентификации ЦИ сформирует следующий ответ, который отправит на redirect_uri
:
HTTP/1.1 302 Found
Location: urn:ietf:wg:oauth:2.0:oob:auto#code=c86322fd3a4cf85fb51249ab3fb4fcd1
Content-Length: 0
Параметр code
(стоящий после символа #) содержит код авторизации, который необходимо извлечь из заголовка Location
.
Типовые ошибки
HTTP-код | Ошибка | Описание |
---|---|---|
400 | invalid_client | OAuth-клиент не зарегистрирован или неверно указан clientID. |
400 | unauthorized_client | OAuth-клиент использует незарегистрированный сценарий аутентификации (Flow) или был передан некорретный redirect_uri . |
400 | invalid_request | Неверно сформирован параметр resource . |
500 | An error has occurred | Проверяющая сторона с идентификатором resource не зарегистрирована. |
Получение маркера доступа
Для получения маркера доступа используется конечная точка /token. Клиент формирует следующий HTTP-запрос:
POST https://<hostname>/<stsappname>/oauth/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Accept: */*
content-length: 139
grant_type=authorization_code&code=9e554074113426cb2f4430f51b68170a&redirect_uri=http%3A%2F%2Fgrand-pc%2FauthorizationCode&client_id=sample
Параметры запроса:
grant_type
- в данном сценарии имеет значениеauthorization_code
.code
- код авторизации, полученный на предыдущем этапе.redirect_uri
- зарегистрированный на Центре Идентификации адрес возврата (по этому адресу будет возвращен запрошенный код авторизации).
Примечание
Значение параметра должно соответствовать значению адреса возврата, заданного при регистрации клиента на ЦИ.
client_id
- идентификатор клиента OAuth, зарегистрированный на ЦИ DSS.
Если в рамках сценария необходима аутентификация клиентского приложени и известен его секрет, запрос необходимо модифицировать.
Параметр client_id
в теле запроса должен был заменен на заголовок Auhtorization HTTP-запроса, имеющий значение Basic Base64(client_id:client_secret)
.
В случае успешной обработки запроса Центром Идентификации ответ будет содержать:
access_token
- Маркер доступа, выпущенный Центром Идентификации DSStoken_type
- Тип токенаexpires_in
- Время жизни токена в секундах
Значение параметра access_token
необходимо будет использовать при обращениях к Сервису Подписи.
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 2268
Content-Type: application/json; charset=utf-8
Expires: -1
{"access_token":"eyJ0eXAiOiJKV1Q ... LnS1sAunDSE1hh3A5n8W7lhPSM4z_VA","expires_in":300,"token_type":"Bearer"}
HTTP-код | Ошибка | Описание |
---|---|---|
400 | invalid_client | OAuth-клиент не зарегистрирован или неверно указан clientID. |
400 | unauthorized_client | OAuth-клиент использует незарегистрированный сценарий аутентификации (Flow) или был передан некорретный redirect_uri . |
400 | invalid_request | Неверно сформирован параметр resource . |
400 | invalid_grant | Невалидный код авторизации. |
500 | An error has occurred | Проверяющая сторона с идентификатором resource не зарегистрирована. |
Пример сообщения об ошибке
HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Date: Fri, 21 Dec 2018 13:46:42 GMT
Connection: close
{"error":"invalid_client"}