При интеграции сторонних систем с 1С:Предприятием через HTTP-сервисы часто возникает задача предоставить доступ к веб-методам без постоянного интерактивного ввода учетных данных. Если внешняя система не может передавать авторизационные заголовки или требуется настроить жестко заданную сервисную учетную запись на стороне веб-сервера, параметры аутентификации прописываются непосредственно в файле публикации default.vrd.
Разберем по шагам, как правильно составить строку подключения к информационной базе, избежать ошибок парсинга XML-конфигурации и обеспечить безопасность публикуемых сервисов.
Файл default.vrd представляет собой XML-документ, управляющий публикацией информационной базы на веб-сервере (Apache или IIS). Параметры подключения к серверу 1С задаются в корневом теге point в атрибуте ib.
По умолчанию строка подключения к клиент-серверной базе выглядит следующим образом:
ib="Srvr="localhost";Ref="test";"
Чтобы платформа не запрашивала логин и пароль при каждом HTTP-запросе, добавим в эту строку параметры Usr (имя пользователя) и Pwd (пароль).
Рассмотрим правильный формат записи:
ib="Srvr="localhost";Ref="test";Usr="Programmer";Pwd="123456";"
Проанализируем ключевые правила оформления строки подключения:
;. Не допускается ставить двойную точку с запятой подряд (например, ;;Usr), так как это приведет к ошибке разбора строки.ib уже заключена в двойные кавычки атрибута XML, внутренние кавычки вокруг значений параметров должны экранироваться как " или опускаться.
ib="Srvr=localhost;Ref=test;Usr=Programmer;Pwd=123456;"
ib="Srvr="srv-1c-app";Ref="trade_base";Usr="Сервисный Пользователь";Pwd="P@ssw0rd!";"
Когда логин и пароль зашиваются в файл публикации, любой запрос к веб-серверу выполняется с правами указанной учетной записи. Если база опубликована целиком, злоумышленники могут получить доступ к веб-клиенту или стандартному интерфейсу OData. Чтобы этого избежать, настроим жесткие ограничения в файле 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="/my_api"
ib="Srvr="localhost";Ref="test";Usr="WebServiceUser";Pwd="Secret123";">
<standardOData enable="false"/>
<httpServices publishByDefault="false">
<service name="ОбменДанными" rootUrl="exchange" enable="true"/>
</httpServices>
</point>
Разберем параметры безопасности:
<webClient enable="true"/>, чтобы нельзя было открыть пользовательский интерфейс 1С через браузер под служебной учетной записью.<standardOData enable="false"/> блокирует стандартный REST-интерфейс ко всем таблицам информационной базы.publishByDefault="false" внутри тега httpServices запрещает автоматическую публикацию всех имеющихся в конфигурации сервисов. Доступ открывается только для явно объявленного тега service.Для учетной записи, указанной в default.vrd, необходимо соблюдать принцип наименьших привилегий:
СервисОбменаДанными), в которой отметим только право Использование для конкретного HTTP-сервиса.УстановитьПривилегированныйРежим(Истина).Если требуется избежать открытого хранения пароля в конфигурационном файле default.vrd, рассмотрим другие подходы:
ib без параметров Usr и Pwd, а вызывающая сторона передает стандартный заголовок Authorization: Basic <base64> в каждом запросе. Платформа 1С автоматически прочитает заголовок и выполнит вход под переданным пользователем.default.vrd прописывается технический пользователь с нулевыми правами доступа к данным, а в теле метода HTTP-сервиса 1С извлекается кастомный заголовок (например, X-API-Key). Код модуля проверяет валидность ключа и при ошибке возвращает HTTP-ответ со статусом 401 или 403.При частых запросах к HTTP-сервису создание нового сеанса 1С на каждый вызов создает высокую нагрузку на сервер. Для оптимизации используем пул сеансов в default.vrd:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
base="/my_api"
ib="Srvr="localhost";Ref="test";Usr="WebServiceUser";Pwd="Secret123";"
reuseSessions="autouse"
sessionMaxAge="60">
...
</point>
Параметр reuseSessions="autouse" позволяет платформе удерживать созданный сеанс в памяти и переиспользовать его для последующих запросов, что существенно снижает задержку ответа сервиса.