Чтобы работать с API Диадока, нужно авторизоваться. Сейчас Диадок поддерживает две схемы авторизации:
Диадок предоставляет возможность аутентифицироваться по протоколу OpenID Connect. Аутентификация происходит с помощью сервиса OpenID Провайдера — сервера, который выдает токен доступа к продукту.
Токен доступа (access_token) — уникальный код, который позволяет идентифицировать пользователя и выполнять действия от его имени в API Диадока. Его нужно передавать в методы API в HTTP-заголовке Authorization.
Для настройки интеграционного решения на работу с OpenID Connect, нужно реализовать собственное клиентское приложение или воспользоваться готовыми сертифицированными библиотеками OpenID Connect.
Чтобы реализовать эту схему аутентификации, выполните шаги:
Оставьте заявку на странице интеграции. После этого с вами свяжется менеджер, предоставит вам доступ в Кабинет интегратора и выдаст идентификатор вашего приложения client_id.
Выпустите в Кабинете интегратора ключ приложения client_secret по инструкции. Это секретный ключ, не передавайте его третьим лицам.
Выберите подходящий для вашего приложения алгоритм по схеме ниже:
Затем:
укажите выбранный алгоритм в Кабинете интегратора в настройке приложения «Способ получения токенов»,
реализуйте выбранный алгоритм в вашем приложении согласно инструкции:
Получите с помощью выбранного алгоритма токен доступа access_token и используйте его в заголовке Authorization при вызовах методов API Диадока:
Authorization: Bearer <access_token>
Пример вызова метода
GET /GetMyOrganizations
Host: diadoc-api.kontur.ru
Authorization: Bearer {{access_token}}
Accept: application/json
Обновите токен доступа access_token до истечения времени его жизни.
Алгоритм подходит для приложений с серверной частью (c бэкендом).
Примечание
Примеры реализации описанного алгоритма можно посмотреть в проекте веб-приложения.
Вы можете использовать примеры, чтобы не реализовывать взаимодействие с OpenID Провайдером самостоятельно.
Получите временный код подтверждения.
Для этого перенаправьте пользователя из приложения на страницу авторизации с помощью запроса GET /connect/authorize сервиса OpenID Провайдера.
В ответ OpenID Провайдер запросит у пользователя данные для входа и разрешения, а затем перенаправит его на указанный вами адрес и вернет в нем временный код подтверждения.
Подробнее
Параметры запроса GET /connect/authorize
response_type — ответ, который нужно получить от OpenID Провайдера. Укажите значение code.
client_id — идентификатор вашего приложения.
scope — список прав доступа, которые необходимы приложению в текущей сессии. Укажите следующие значения для доступа к данным Диадока:
openid — для взаимодействие с Провайдером по OpenID Connect,
profile — для получения основной информация о пользователе,
email — для получения адреса электронной почты пользователя,
offline_access — для доступа к refresh_token для обновления токена,
Diadoc.PublicAPI.Staging — для работы с тестовым пространством Диадока,
Diadoc.PublicAPI — для работы с продуктовым пространством Диадока.
redirect_uri — ссылка, на которую будет перенаправлен пользователь после аутентификации. Такая же ссылка должна быть указана в списке разрешенных адресов в Кабинете интегратора.
nonce — строка, предназначенная для проверки того, что запрос связан с токеном доступа. Она должна вернутся при получении токена доступа.
Все передаваемые параметры должны быть в формате url_encoded.
Пример запроса
GET /connect/authorize
?response_type=code
&client_id={{client_id}}
&scope=openid profile email offline_access Diadoc.PublicAPI
&redirect_uri=http://www.example.com/
&nonce=n-0S6_WzA2Mj HTTP/1.1
Host: identity.kontur.ru
Content-type: application/x-www-form-urlencoded
В ответ метод перенаправит пользователя на страницу аутентификации. После того, как пользователь введет свои данные и выдаст разрешения на странице аутентификации, OpenID Провайдер перенаправит его на URL-адрес, указанный в поле redirect_uri. В нем будет содержаться сгенерированный временный код подтверждения и другие параметры.
Параметры ответа в строке URL
code — временный код подтверждения, который нужно обменять на токен доступа access_token.
state — cтрока состояния, которую OpenID Провайдер возвращает без изменения.
scope — список прав доступа, которые выдал пользователь вашему приложению.
error — ошибка аутентификации access_denied. Возвращается вместо кода подтверждения, если пользователь или сервер по какой-то причине не выдал разрешение на доступ к данным.
Пример ответа с кодом подтверждения
HTTP/1.1 302 Found
Location: https://www.example.com
?code=SplxlOBeZQQYbYS6WxSbIA
&state=af0ifjsldkj
&scope=openid profile email offline_access Diadoc.PublicAPI
Пример ответа с ошибкой
HTTP/1.1 302 Found
Location: https://www.example.com
?error=access_denied
&error_description=
&state=af0ifjsldkj
Обменяйте временный код подтверждения на токен доступа access_token.
Для этого выполните запрос POST /connect/token сервиса OpenID Провайдера.
В ответе метод вернет токен доступа access_token, время его жизни и токен обновления refresh_token, с помощью которого можно обновить токен доступа.
Подробнее
Параметры запроса POST /connect/token
grant_type — способ запроса токена. Укажите значение authorization_code.
code — временный код подтверждения.
client_id — идентификатор вашего приложения.
client_secret — ключ приложения вашего приложения.
redirect_uri — ссылка, на которую получен код подтверждения.
Все передаваемые параметры должны быть в формате url_encoded.
Пример запроса
POST /connect/token HTTP/1.1
Host: identity.kontur.ru
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
code=SplxlOBeZQQYbYS6WxSbIA
client_id={{client_id}}
client_secret={{client_secret}}
redirect_uri=http://www.example.com
Если запрос был выполнен успешно, OpenID Провайдер вернет в ответе токен доступа access_token и токен для обновления refresh_token.
Если токен выдать не удалось, OpenID Провайдер вернет в ответе ошибку.
Параметры ответа POST /connect/token
access_token — токен доступа.
token_type — тип токена. Всегда имеет значение Bearer.
refresh_token — токен для обновления токена доступа.
expires_in — время жизни токена доступа access_token в секундах.
id_token — токен авторизации.
Пример ответа
200 OK
Content-type: application/json
{
"access_token": "811d58...40",
"token_type": "Bearer",
"refresh_token":"RjY2NjM5NzA2OWJjuE7c",
"expires_in": 3600,
"id_token": "eyJhbGciOifQ.ewogI3pAKfQ.ggW8hq-rvKMzqg"
}
Вы можете обновить токен доступа access_token до истечения времени его жизни, чтобы пользователю не пришлось повторно проходить аутентификацию.
Алгоритм подходит для приложений, в которых пользователю сложно вводить данные для аутентификации, например: desktop-приложения, консольные приложения, смарт-устройства, телевизоры. Этот способ получения токена подразумевает, что вместо своих данных пользователь может ввести в браузере некий код, полученный от приложения.
Получите временный код подтверждения.
Для этого выполните запрос POST /connect/deviceauthorization сервиса OpenID Провайдера.
В ответ OpenID Провайдер вернет приложению временный код подтверждения, код проверки пользователя и URI для авторизации.
Подробнее
Параметры запроса POST /connect/deviceauthorization
client_id — идентификатор вашего приложения.
client_secret — ключ приложения вашего приложения.
scope — список прав доступа, которые необходимы приложению в текущей сессии. Укажите следующие значения для доступа к данным Диадока:
openid — для взаимодействие с Провайдером по OpenID Connect,
profile — для получения основной информация о пользователе,
email — для получения адреса электронной почты пользователя,
offline_access — для доступа к refresh_token для обновления токена,
Diadoc.PublicAPI.Staging — для работы с тестовым пространством Диадока,
Diadoc.PublicAPI — для работы с продуктовым пространством Диадока.
Все передаваемые параметры должны быть в формате url_encoded.
Пример запроса
POST /connect/deviceauthorization HTTP/1.1
Host: identity.kontur.ru
Content-Type: application/x-www-form-urlencoded
client_id={{client_id}}
client_secret={{client_secret}}
scope=openid profile email offline_access Diadoc.PublicAPI
Параметры ответа POST /connect/deviceauthorization
device_code — временный код подтверждения, который нужно обменять на токен доступа access_token.
user_code — код, который пользователь должен ввести на странице ввода кода в приложении.
verification_uri — URI страницы, на которую нужно перенаправить пользователя для ввода кода, если приложение не умеет открывать пользовательский браузер.
verification_uri_complete — URI страницы, на которую нужно перенаправить пользователя в браузере.
interval — периодичность попыток обмена device_code на access_token в секундах.
expires_in — время жизни токена доступа access_token в секундах.
Пример ответа с кодом подтверждения
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"device_code":"NGU5OWFiNjQ5YmQwNGY3YTdmZTEyNzQ3YzQ1YSA",
"user_code": "BDWPHQPK",
"verification_uri": "https://identity.kontur.ru/device",
"verification_uri_complete": "https://identity.kontur.ru/device?user-code=BDWPHQPK",
"interval": 3,
"expires_in": 300
}
Пример ответа с ошибкой
HTTP/1.1 400 OK
Content-Type: application/json
Cache-Control: no-store
{
"error": "invalid_client"
}
Перенаправьте пользователя на страницу авторизации, где он должен ввести свои данные и выдать доступ вашему приложению.
Подробнее
Это можно сделать следующими способами:
Открыть в браузере ссылку, полученную в verification_uri_complete.
Отрисовать пользователю QR-код со ссылкой, полученной в verification_uri_complete. Отсканировав этот код, пользователь перейдет на страницу авторизации.
После этого пользователь должен перейти по предложенной ссылке на своем персональном устройстве, авторизоваться и разрешить вашему приложению получить доступ к данным.
Обменяйте временный код подтверждения на токен доступа access_token.
В то время, как пользователь авторизуется, приложение должно периодически выполнять запрос POST /connect/token сервиса OpenID Провайдера до тех пор, пока не получит токен доступа или ошибку.
Подробнее
В ответ на запрос POST /connect/token OpenID Провайдер может вернуть:
ошибку authorization_pending — пользователь не завершил авторизацию.
ошибку access_denied — на странице авторизации пользователь отказался выдать требуемый доступ.
ошибку expired_token — срок действия временного кода подтверждения истек.
токен доступа access_token — пользователь авторизовался и выдал требуемый доступ.
Приложение должно повторять запрос все время, пока OpenID Провайдер возвращает в ответ authorization_pending.
Параметры запроса POST /connect/token
grant_type — тип ответа. Укажите значение urn:ietf:params:oauth:grant-type:device_code.
client_id — идентификатор вашего приложения.
client_secret — ключ приложения вашего приложения.
scope — список прав доступа, которые необходимы приложению в текущей сессии.
device_code — временный код подтверждения.
Все передаваемые параметры должны быть в формате url_encoded.
Пример запроса
POST /connect/token HTTP/1.1
Host: identity.kontur.ru
Content-type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:device_code
client_id={{client_id}}
client_secret={{client_secret}}
scope=openid profile email offline_access Diadoc.PublicAPI
device_code=NGU5OWFiNjQ5YmQwNGY3YTdmZTEyNzQ3YzQ1YSA
Если запрос был выполнен успешно, OpenID Провайдер вернет в ответе токен доступа access_token и токен для обновления refresh_token.
Если токен выдать не удалось, OpenID Провайдер вернет в ответе ошибку.
Параметры ответа POST /connect/token
access_token — токен доступа.
id_token — токен авторизации.
refresh_token — токен для обновления токена доступа.
token_type — тип токена. Всегда имеет значение Bearer.
expires_in — время жизни токена доступа access_token в секундах.
scope — список прав доступа, которые выдал пользователь вашему приложению.
Пример ответа с токеном доступа
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token":"AYjcyMzY3ZDhiNmJkNTY",
"id_token": "eyJhbGciOifQ.ewogI3pAKfQ.ggW8hq-rvKMzqg",
"refresh_token":"RjY2NjM5NzA2OWJjuE7c",
"token_type":"Bearer",
"expires_in":3600,
"scope":"openid profile email offline_access Diadoc.PublicAPI"
}
Пример ответа с ошибкой
HTTP/1.1 400 OK
Content-Type: application/json
Cache-Control: no-store
{
"error": "authorization_pending"
}
Вы можете обновить токен доступа access_token до истечения времени его жизни, чтобы пользователю не пришлось повторно проходить аутентификацию.
Время жизни токена доступа access_token ограничено. До истечения этого времени его нужно обновить, иначе методы API будут возвращать ошибки, а пользователю вновь придется авторизовываться в OpenID Провайдере.
Определить время жизни токена доступа access_token можно по значению поля expires_in, полученного вместе с токеном.
Чтобы обновить токен доступа access_token, используйте refresh_token, полученный вместе с ним при запросе. Для этого выполните запрос POST /connect/token сервиса OpenID Провайдера.
Примечание
Обратите внимание, что refresh_token вернется в ответе запросов на получение токена GET /connect/authorize и POST /connect/deviceauthorization только если вы указали в них параметр scope = offline_access.
Подробнее
Параметры запроса POST /connect/token
grant_type — способ запроса токена. Укажите значение refresh_token.
client_id — идентификатор вашего приложения.
client_secret — ключ приложения вашего приложения.
refresh_token — токен для обновления токена доступа.
Все передаваемые параметры должны быть в формате url_encoded.
Пример запроса
POST /connect/token HTTP/1.1
Host: identity.kontur.ru
Content-type: application/x-www-form-urlencoded
grant_type=refresh_token
client_id={{client_id}}
client_secret={{client_secret}}
refresh_token=1487e3f7ce5aea612e2d7727ded76ad574e30643046ae2c247ae9c94c6b61e71
Параметры ответа POST /connect/token
access_token — токен доступа.
token_type — тип токена. Всегда имеет значение Bearer.
expires_in — время жизни токена доступа access_token в секундах.
refresh_token — токен для обновления токена доступа.
Пример ответа
200 OK
Content-type: application/json
{
"access_token": "811d583cf85deb7ab67bd91b96a9a4bafb63d6a062d7dd72f81601b84c19dc40",
"token_type": "Bearer",
"expires_in": 86400,
"refresh_token": "fd672752f8e9c4a8eb083fb2375b3126ae37dc69a0cf46953ef9a6e3f5a692df"
}
Методы Диадока, которые работают с ящиком, контролируют доступ пользователя к этому ящику по следующему алгоритму:
Диадок извлекает из HTTP-заголовка Authorization значение параметра access_token и с его помощью определяет идентификатор пользователя. Если какое-то действие не удалось выполнить, метод вернет код ошибки 401 (Unauthorized). Это возможно в следующих случаях:
в запросе отсутствует HTTP-заголовок Authorization,
в HTTP-заголовке Authorization не указан access_token,
токен поврежден или просрочен.
По идентификатору пользователя Диадок находит ящики, к которым у пользователя есть доступ. Этот список ящиков совпадает с тем, что вернется в ответе метода GetMyOrganizations.
Диадок извлекает из параметров запроса идентификатор ящика. Если идентификатор ящика не входит в список ящиков, доступных пользователю, метод вернет код ошибки 403 (Forbidden).
Предупреждение
Способ авторизации с помощью методов API Диадока является устаревшим и не рекомендуется к использованию. Используйте вместо него авторизацию через OpenID Connect.
Для авторизации с помощью методов API нужна следующая информация:
ключ разработчика — уникальный идентификатор интегратора в формате GUID. Чтобы получить ключ разработчика, оставьте заявку на странице интеграции. Не передавайте свой ключ третьим лицам.
авторизационный токен — массив байтов, однозначно идентифицирующий пользователя.
Эту информацию нужно передавать в стандартном HTTP-заголовке Authorization в соответствии со схемой аутентификации Диадока DiadocAuth со следующими параметрами:
ddauth_api_client_id — определяет ключ разработчика,
ddauth_token — определяет авторизационный токен.
Значения параметров в заголовке отделяются от их имен символами «=», параметры разделяются символами «,». Например:
Authorization: DiadocAuth
ddauth_api_client_id=testClient-8ee1638deae84c86b8e2069955c2825a,
ddauth_token=3IU0iPhuhHPZ6lrlumGz4pICEedhQ1XmlMN1Pk8z0DJ51MXkcTi6Q3CODCC4xTMsjPFfhK6XM4kCJ4JJ42hlD499/Ui5WSq6lrPwcdp4IIKswVUwyE0ZiwhlpeOwRjNrvUX1yPrxr0dY8a0w8ePsc1DG8HAlZce8a0hZiWylMqu23d/vfzRFuA==
Подробная информация обо всех способах получения токена приведена на странице метода Authenticate (V3).
При вызове метода Authenticate в параметре ddauth_api_client_id HTTP-заголовка Authorization передайте ключ разработчика.
Необязательно вызывать метод Authenticate (V3) перед каждым обращением к методам API Диадока — авторизационные токены можно кэшировать. Мы рекомендуем сохранить и использовать полученный токен в течение всего сеанса работы. Полученный токен остается действительным в течение 24 часов.
Ключ разработчика и полученный авторизационный токен нужно передавать в каждый метод API. Для этого при вызове методов API нужно к каждому запросу добавлять HTTP-заголовок Authorization с параметрами ddauth_api_client_id и ddauth_token. Например, HTTP-запрос на получение списка доступных пользователю ящиков будет выглядеть так:
GET https://diadoc-api.kontur.ru/GetMyOrganizations HTTP/1.1
Host: diadoc-api.kontur.ru
Authorization: DiadocAuth ddauth_api_client_id=testClient-8ee1638deae84c86b8e2069955c2825a,ddauth_token=3IU0iPhuhHPZ6lrlumGz4pICEedhQ1XmlMN1Pk8z0DJ51MXkcTi6Q3CODCC4xTMsjPFfhK6XM4kCJ4JJ42hlD499/Ui5WSq6lrPwcdp4IIKswVUwyE0ZiwhlpeOwRjNrvUX1yPrxr0dY8a0w8ePsc1DG8HAlZce8a0hZiWylMqu23d/vfzRFuA==
Методы, работающие с определенным ящиком, контролируют доступ к нему по следующему алгоритму:
Сервер Диадока извлекает из HTTP-заголовка Authorization значение параметра ddauth_token. После его декодирования сервер получает идентификатор пользователя. Если какое-то действие не удалось выполнить, метод вернет код ошибки 401 (Unauthorized). Это возможно в случаях, когда:
в запросе отсутствует HTTP-заголовок Authorization,
нет параметра ddauth_token,
токен поврежден или просрочен,
указан некорректный ddauth_api_client_id.
По идентификатору пользователя Диадок находит ящики, к которым у пользователя есть доступ. Список ящиков совпадает со списком, который вернет метод GetMyOrganizations.
Сервер извлекает идентификатор ящика из параметров запроса. Если идентификатор ящика не входит в список ящиков, доступных пользователю, метод вернет код ошибки 403 (Forbidden).
См. также
- Методы для аутентификации:
-