При интеграции сторонних систем с 1С через HTTP-сервисы часто возникает необходимость принимать входящие запросы без передачи стандартного заголовка Authorization: Basic со стороны клиента. По умолчанию платформа 1С:Предприятие требует обязательной аутентификации пользователя для любого обращения к опубликованным веб- и HTTP-сервисам. Если заголовок не передан, веб-сервер возвращает ответ 401 Unauthorized с требованием ввести логин и пароль.
Рассмотрим подробнее, как обойти обязательный запрос учетных данных от внешнего клиента, как правильно настроить файл публикации default.vrd, с какими рисками сопряжен данный подход и какие безопасные альтернативы существуют в экосистеме 1С.
Самый быстрый способ исключить требование Basic-аутентификации на стороне вызывающей программы — зафиксировать параметры служебного пользователя непосредственно в строке подключения информационной базы. В этом случае веб-сервер подключается к базе под заданной учетной записью автоматически.
Разберем по шагам, как внести изменения в файл default.vrd:
default.vrd.point и его атрибут ib, в котором задана строка соединения с информационной базой.Usr (имя пользователя) и Pwd (пароль).ib нельзя оборачивать обычными двойными кавычками — это нарушит валидность XML. Необходимо использовать XML-экранирование: вместо кавычки пишем специальную последовательность ".Посмотрим на пример корректно оформленного файла default.vrd:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/myhttpservice"
ib="Srvr="SERVER";Ref="BASE";Usr="user1c";Pwd="1";"
enable="false">
<httpServices publishByDefault="false">
<service name="МойСервис" enable="true"/>
</httpServices>
</point>
После сохранения файла и перезапуска веб-сервера все входящие запросы к сервису будут обрабатываться от имени пользователя user1c без запроса логина и пароля у внешнего приложения.
Проанализируем ситуацию с точки зрения безопасности и стабильности работы системы. У данного способа есть существенные недостатки, о которых необходимо помнить:
default.vrd не зашифрованы. Любой пользователь или служба с доступом к файловой системе веб-сервера получает полный доступ к учетной записи 1С.Чтобы минимизировать риски при использовании сервисной учетной записи, разберем правила безопасной публикации HTTP-сервисов:
point устанавливайте атрибут enable="false". Это запрещает запуск интерактивного сеанса через данную точку публикации.httpServices указывайте атрибут publishByDefault="false" и явно активируйте только требуемые интеграционные точки через <service name="..." enable="true"/>.Если клиенты не могут передавать заголовок авторизации, но мы не хотим хранить пароль базы в default.vrd, рассмотрим архитектурное решение с использованием обратного прокси-сервера (Nginx или Apache).
Authorization: Basic <Base64-строка>.В такой конфигурации сама публикация 1С остается защищенной стандартной авторизацией, а учетные данные изолированы в защищенной конфигурации прокси-сервера.
Часто отказ от Basic Auth вызван необходимостью использовать современные механизмы аутентификации (например, Bearer-токены или API-ключи). В этом случае публикация настраивается на технического пользователя с минимальными правами, а реальная валидация клиента переносится в модуль HTTP-сервиса.
Посмотрим на пример проверки токена внутри обработчика метода сервиса:
Функция МойМетодGET(Запрос)
// Считываем токен из заголовков запроса
ТокенКлиента = Запрос.Заголовки.Получить("X-API-Key");
Если Не ЗначениеЗаполнено(ТокенКлиента) Или Не ПроверитьТокенВБазе(ТокенКлиента) Тогда
Ответ = Новый HTTPСервисОтвет(401);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("{""error"": ""Недействительный токен авторизации""}");
Возврат Ответ;
КонецЕсли;
// Выполнение основной логики сервиса
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("{""status"": ""success""}");
Возврат Ответ;
КонецФункции
В данном сценарии объект HTTPСервисЗапрос предоставляет доступ к коллекции Заголовки, что позволяет реализовать гибкую проверку ключей доступа через регистры сведений или справочники базы, возвращая объект HTTPСервисОтвет с соответствующим статусом ошибки.
Когда все запросы к HTTP-сервису поступают под одним пользователем, платформа может тратить значительные ресурсы на постоянное открытие и закрытие сеансов. Чтобы оптимизировать быстродействие и сократить расход клиентских лицензий, настроим пул сеансов в default.vrd.
Для узла сервиса используются следующие параметры:
reuseSessions="autouse" — указывает платформе повторно использовать свободные сеансы пула для входящих запросов.sessionMaxAge — определяет время жизни неактивного сеанса в пуле (в секундах) перед его уничтожением.Посмотрим, как выглядит описание сервиса с включенным пулом:
<httpServices publishByDefault="false">
<service name="МойСервис"
enable="true"
reuseSessions="autouse"
sessionMaxAge="120"/>
</httpServices>
Такая настройка исключает повторную инициализацию сеанса при каждом входящем HTTP-пакете, снижает нагрузку на сервер 1С:Предприятия и существенно ускоряет время ответа сервиса.