Аутентификация в HTTP-сервисах приложения для неинтерактивных пользователей
Запрос к HTTP-сервису может быть выполнен не конечным пользователем, а внешней системой. Например, запрос доступа к сервису может быть сделан другим приложением или консольной утилитой по расписанию. В этом случае для аутентификации пользователя используются токены доступа. Чтобы предоставить права на ресурсы приложения внешней программе, нужно установить связь между этой программой и пользователем приложения. В большинстве случаев для этого рекомендуется создавать отдельных служебных пользователей для внешних программ.
Настройка доступа внешнего приложения к ресурсу
Пусть в приложении есть HTTP-сервис и пользователь, обладающий правом вызова этого сервиса. Убедиться, что пользователь обладает правом доступа к данному сервису, можно в свойствах этого сервиса или в YAML-файле. Подробнее о контроле прав доступа читайте здесь. Если для вашего приложения не существует соответствующего пользователя, его необходимо создать, подключить к приложению и т. д. (подробнее см. здесь).
Далее, один раз, необходимо в приложении получить ключ доступа для этого пользователя.
После этого при каждом вызове HTTP-сервиса внешняя программа должна отправить запрос на получение токена аутентификации по адресу:
http://serverhost:port/applications/{app}/sys/token
где {app} — это название приложения из HTTP-пути публикации. Например, так может выглядеть соответствующая ссылка для Демонстрационного приложения:
http://localhost:9090/applications/DemonstratsionnoePrilozhenie/sys/token
Получение токена выполняется с проверкой прав работы пользователя в приложении с помощью токенов.
Формат запроса для получения токена:
POST <URL>
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <Base64(ClientId:ClientSecret)>
grant_type=CLIENT_CREDENTIALS
Во встроенном языке этот же запрос может выглядеть следующим образом:
метод Скрипт()
исп Ответ = КлиентHttp.ЗапросPost("http://127.0.0.1:9090/applications/DemonstratsionnoePrilozhenie/sys/token").ДобавитьЗаголовок("Content-Type", "application/x-www-form-urlencoded")
.ДобавитьЗаголовок("Authorization", "Basic " + Кодировки.Base64.КодироватьВСтроку(
"YzxctW-0W8dnIQ7q6XMCXV0IwVz3W_kee-c8HByMrjs=:1wEqWtJ7oM0bOuciVOBsJTv_r8v0zkGSf_8lARSHMtA="))
.УстановитьТело("grant_type=CLIENT_CREDENTIALS")
.Выполнить()
В случае успешного получения токена внешняя программа получит ответ в формате JSON:
{
"id_token": "<сериализованный токен аутентификации>",
"token_type": "Bearer"
}
После того как токен получен, можно вызывать HTTP-сервис из приложения. Для этого в запрос нужно добавить заголовок Authorization:
Authorization: Bearer <токен, полученный от менеджера аутентификации>
Во встроенном языке этот же запрос может выглядеть следующим образом:
// Прочитать ответ из JSON
пер ДанныеОтвета = СериализацияJson.ПрочитатьСоответствие(Ответ.Тело)
// Получить токен из JSON
пер Токен = ДанныеОтвета.Получить("id_token")
исп Статус = КлиентHttp.ЗапросGet("http://127.0.0.1:9090/console/api/v2/applications/1ed76519-66b9-6fcc-9dfa-2f405661fde3")
.ДобавитьЗаголовок("Authorization", "Bearer " + Токен).Выполнить()
Токен действителен в течение часа. Таким образом, можно сделать сразу несколько вызовов (возможно разных сервисов), используя уже полученный токен, а не получая его заново.
Если токен устарел, то при вызове HTTP-сервиса вернется ответ с кодом 401. Это значит, что нужно снова запросить токен аутентификации.