Аутентификация по веб-ссылке
Для приложений без серверной части можно получить Access Token с помощью device flow. Этот способ также подходит для приложений, которые напрямую взаимодействуют с API Контур.Экстерна, например, для модуля 1С.
Конечный пользователь использует свою учетную запись Контура для аутентификации. По кнопке «Войти» в приложении он переходит на страницу auth.kontur.ru и выдает разрешение на доступ к выбранным данным. После возвращается в приложение.
Алгоритм аутентификации
Аутентификация выполняется в три этапа:
Получение device code.
Аутентификация по веб-ссылке.
Получение Access Token.
Второй и третий этапы проходят параллельно.
Получение device code
Для получения device code необходимо отправить запрос.
Метод: POST DeviceAuthorization.
Примечание
В документации Контур.API пока не реализован метод POST DeviceAuthorization. Рекомендуем использовать коллекцию Postman
для запросов.
Параметры тела запроса
Content-Type: application/x-www-form-unlencoded
client_id
– сервисное имя, выдается вместе с api-key;client_secret
– api-key;scope
– область действия токена. Укажите значение: extern.api.
Ответ
В ответ OpenID Провайдер вернет device code
и ссылку на веб-страницу auth.kontur.ru.
После получения device code приложение должно отправить пользователя на аутентификацию по веб-ссылке и параллельно делать попытки обменять device code на Access Token.
Количество попыток и время жизни токена вернутся в параметрах interval
и expires_in
.
Пример запроса
POST /connect/deviceauthorization HTTP/1.1
Host: identity.kontur.ru
Content-type: application/x-www-form-urlencoded
client_id=awesome_device_client
client_secret=yourClientSecret
scope=extern.api
Пример ответа
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"device_code":"NGU5OWFiNjQ5YmQwNGY3YTdmZTEyNzQ3YzQ1YSA",
"user_code": "BDWPHQPK",
"verification_uri": "<https://identity.testkontur.ru/device>",
"verification_uri_complete": "<https://identity.testkontur.ru/device?user-code=BDWPHQPK>",
"interval": 3,
"expires_in": 300
}
Аутентификация по веб-ссылке
Передать ссылку конечному пользователю можно двумя способами:
Открыть в браузере ссылку из возвращенного параметра
verification_uri_complete
.Передать QR-код со ссылкой из возвращенного параметра
verification_uri_complete
.
Подробнее о формировании ссылки смотрите в документации OpenID Провайдер.
Получение Access Token
Параллельно аутентификации по веб-ссылке необходимо регулярно пытаться получить Access Token.
Метод: POST TokenEndpoint.
Параметры тела запроса
Content-Type: application/x-www-form-unlencoded
grant_type
– тип аутентификации. Укажите значение:urn:ietf:params:oauth:grant-type:device_code
;client_id
– сервисное имя, выдается вместе с api-key;client_secret
– api-key;scope
– область действия токена. Укажите значение:extern.api
;device-code
– полученный код.
Ответ
В ответ OpenID Провайдер возвращает приложению Access Token.
Пример запроса
POST /connect/tokenHTTP/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=awesome_device_client
client_secret=yourClientSecret
device_code=NGU5OWFiNjQ5YmQwNGY3YTdmZTEyNzQ3YzQ1YSA
scope=extern.api
Пример ответа
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token":"AYjcyMzY3ZDhiNmJkNTY",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjExNjVlMDVlMDgwMDllOTE1MjI3MDY0NzlmOTcwMGJkIiwidHlwIjoiSldUIn0.eyJuYmYiOjE2NTQwMTg1NDIsImV4cCI6MTY1NDAxODg0MiwiaXNzIjoiaHR0cHM6Ly9pZGVudGl0eS50ZXN0a29udHVyLnJ1IiwiYXVkIjoib2lkYy5kZXZpY2VmbG93LmV4YW1wbGUiLCJpYXQiOjE2NTQwMTg1NDIsImF0X2hhc2giOiJKblNIQkVZNFM4YUpOdTIxUkJ2SkxnIiwic3ViIjoiZDZmMzgwMzQtNzJhNy00YjczLTkyNDQtNjU5NWEzNzZkNjMwIiwiYXV0aF90aW1lIjoxNjUzNDYzOTk2LCJpZHAiOiJwb3J0YWwiLCJnaXZlbl9uYW1lIjoi0JTQtdC90LjRgSIsImZhbWlseV9uYW1lIjoi0KHQv9C40YDQuNC00L7QvdC-0LIiLCJtaWRkbGVfbmFtZSI6ItCS0LvQsNC00LjQvNC40YDQvtCy0LjRhyIsIm5hbWUiOiLQodC_0LjRgNC40LTQvtC90L7QsiDQlNC10L3QuNGBINCS0LvQsNC00LjQvNC40YDQvtCy0LjRhyIsImVtYWlsIjoic3Bpcmlkb25vdi5kdkBza2Jrb250dXIucnUiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwidXBkYXRlZF9hdCI6MTY1MjkzODYwNiwicGljdHVyZSI6Imh0dHBzOi8vYXBpLnRlc3Rrb250dXIucnUvY2FiaW5ldC92Mi4wL3VzZXJzL2Q2ZjM4MDM0LTcyYTctNGI3My05MjQ0LTY1OTVhMzc2ZDYzMC9hdmF0YXJzL2N1cnJlbnQ_c2l6ZT1MYXJnZSIsImFtciI6WyJwd2QiLCJtZmEiLCJvdHAiXX0.jnMSCN8MridBYNSJfHUQCOEoBgMvdZek_4dsagAAJGiO0D7Cw2F6-37rJgj-4O1fPTItdTy7JekT4iC8GMx0npnsSaR0HvgIAS_O_Og87Lb8LgynzwYPRSiTFSh9XFj10bZ2N8fkD9gtevgkV_BlAVKlTfOqWVwyL32U2PdpfsM5Wh02QwOqkvFGEowwD2P4EavanBGrjMYY1Dm1F_KHKXnypgaTZd3QkCJTpOBO4dwH_d84K6QaHIl5q7MPiyGZGfwluOnIPWPGdWOoWnDTZqaslt86pJETgaIgSCYrEtGyQGCmUXMCv1OHDoBTElKDUnzMg8DuVOzjmEI7CUpImw",
"refresh_token":"RjY2NjM5NzA2OWJjuE7c",
"token_type":"Bearer",
"expires":3600,
"scope":"extern.api"
}