Как отключить Basic-авторизацию для HTTP-сервисов в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции сторонних систем с 1С через HTTP-сервисы часто возникает необходимость принимать входящие запросы без передачи стандартного заголовка Authorization: Basic со стороны клиента. По умолчанию платформа 1С:Предприятие требует обязательной аутентификации пользователя для любого обращения к опубликованным веб- и HTTP-сервисам. Если заголовок не передан, веб-сервер возвращает ответ 401 Unauthorized с требованием ввести логин и пароль.

Рассмотрим подробнее, как обойти обязательный запрос учетных данных от внешнего клиента, как правильно настроить файл публикации default.vrd, с какими рисками сопряжен данный подход и какие безопасные альтернативы существуют в экосистеме 1С.

Способ 1. Указание сервисного пользователя в файле публикации default.vrd

Самый быстрый способ исключить требование Basic-аутентификации на стороне вызывающей программы — зафиксировать параметры служебного пользователя непосредственно в строке подключения информационной базы. В этом случае веб-сервер подключается к базе под заданной учетной записью автоматически.

Разберем по шагам, как внести изменения в файл default.vrd:

  1. Откроем каталог публикации веб-сервера (Apache или IIS), где расположен файл default.vrd.
  2. Найдем корневой элемент point и его атрибут ib, в котором задана строка соединения с информационной базой.
  3. Добавим в строку соединения параметры Usr (имя пользователя) и Pwd (пароль).
  4. Важный нюанс синтаксиса: поскольку файл конфигурации представляет собой XML-документ, значения строковых параметров внутри атрибута 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=&quot;SERVER&quot;;Ref=&quot;BASE&quot;;Usr=&quot;user1c&quot;;Pwd=&quot;1&quot;;"
       enable="false">
    <httpServices publishByDefault="false">
        <service name="МойСервис" enable="true"/>
    </httpServices>
</point>

После сохранения файла и перезапуска веб-сервера все входящие запросы к сервису будут обрабатываться от имени пользователя user1c без запроса логина и пароля у внешнего приложения.

Риски и последствия жесткой привязки пользователя в default.vrd

Проанализируем ситуацию с точки зрения безопасности и стабильности работы системы. У данного способа есть существенные недостатки, о которых необходимо помнить:

  1. Хранение данных в открытом виде: логин и пароль в файле default.vrd не зашифрованы. Любой пользователь или служба с доступом к файловой системе веб-сервера получает полный доступ к учетной записи 1С.
  2. Обезличенный журнал регистрации: платформа фиксирует все события, вызовы и изменения данных от имени одной и той же сервисной учетной записи. Персонализированный аудит действий внешних пользователей становится невозможным.
  3. Угроза несанкционированного доступа к базе: если по этому же адресу доступен веб-клиент, любой пользователь сможет войти в систему без пароля под правами служебной учетной записи.

Способ 2. Правильная изоляция: создание отдельной публикации

Чтобы минимизировать риски при использовании сервисной учетной записи, разберем правила безопасной публикации HTTP-сервисов:

  1. Разделяйте публикации: никогда не используйте общую публикацию для работы пользователей (веб-клиент / тонкий клиент) и для вызова интеграционных сервисов. Для HTTP-сервисов создавайте отдельный виртуальный каталог.
  2. Отключайте клиентские подключения: в корневом элементе point устанавливайте атрибут enable="false". Это запрещает запуск интерактивного сеанса через данную точку публикации.
  3. Ограничивайте видимость сервисов: в узле httpServices указывайте атрибут publishByDefault="false" и явно активируйте только требуемые интеграционные точки через <service name="..." enable="true"/>.
  4. Минимизируйте права учетной записи: служебный пользователь 1С должен обладать только теми ролями, которые строго необходимы для выполнения логики конкретного сервиса.

Способ 3. Подстановка Basic-авторизации через Reverse Proxy

Если клиенты не могут передавать заголовок авторизации, но мы не хотим хранить пароль базы в default.vrd, рассмотрим архитектурное решение с использованием обратного прокси-сервера (Nginx или Apache).

  1. Внешний клиент отправляет обычный HTTP-запрос (или передает кастомный ключ) на входной прокси-сервер.
  2. Прокси-сервер перехватывает запрос и автоматически формирует заголовок Authorization: Basic <Base64-строка>.
  3. Запрос с внедренным заголовком передается на внутренний веб-сервер 1С.

В такой конфигурации сама публикация 1С остается защищенной стандартной авторизацией, а учетные данные изолированы в защищенной конфигурации прокси-сервера.

Способ 4. Проверка токенов или API-ключей в коде 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.

Для узла сервиса используются следующие параметры:

  1. reuseSessions="autouse" — указывает платформе повторно использовать свободные сеансы пула для входящих запросов.
  2. sessionMaxAge — определяет время жизни неактивного сеанса в пуле (в секундах) перед его уничтожением.

Посмотрим, как выглядит описание сервиса с включенным пулом:


<httpServices publishByDefault="false">
    <service name="МойСервис" 
             enable="true" 
             reuseSessions="autouse" 
             sessionMaxAge="120"/>
</httpServices>

Такая настройка исключает повторную инициализацию сеанса при каждом входящем HTTP-пакете, снижает нагрузку на сервер 1С:Предприятия и существенно ускоряет время ответа сервиса.

← На главную