Аутентификация в 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. Это значит, что нужно снова запросить токен аутентификации.