При интеграции 1С с внешними системами часто возникает задача: предоставить открытый доступ к одним методам HTTP-сервисов (например, для получения публичного прайс-листа или статуса заказа) и при этом строго ограничить доступ к другим методам (например, для создания документов или работы с персональными данными). В рамках этой статьи мы разберем, как реализовать гибридную схему авторизации для одной информационной базы, используя механизмы публикации на веб-сервере.
Самый надежный и стандартный способ решения задачи — создание двух и более независимых публикаций информационной базы на одном веб-сервере (IIS или Apache). Рассмотрим подробнее, как это работает. Каждая публикация представляет собой отдельный виртуальный каталог в веб-сервере, со своим собственным конфигурационным файлом .vrd. Это позволяет нам настроить один каталог на обязательную авторизацию пользователя, а второй — на автоматический вход под технической учетной записью.
Для начала разберем по шагам процесс создания второй публикации:
PublicServices), отличное от основной публикации.После того как мы создали отдельную публикацию, нам необходимо «научить» её заходить в 1С автоматически. Для этого мы будем редактировать файл конфигурации публикации default.vrd, который находится в выбранном нами каталоге. Проанализируем структуру строки соединения внутри этого файла.
Найдем тег point и его атрибут ib. Чтобы система не запрашивала логин и пароль у внешнего клиента, мы пропишем данные авторизации прямо в строке подключения. Рассмотрим пример изменения параметра:
<?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="/PublicServices"
ib="Srvr="ServerName";Ref="BaseName";Usr="WebUser";Pwd="SecretPass";">
<httpServices>
<service name="OpenData" alias="opendata.1cws" publish="true"/>
</httpServices>
</point>
В данном примере мы добавили параметры Usr (имя пользователя в 1С) и Pwd (его пароль). Теперь при обращении к адресу http://server/PublicServices/hs/OpenData веб-сервер будет автоматически авторизоваться в 1С от имени WebUser.
Разумеется, создание «беспарольной» точки входа несет определенные риски. Проанализируем ситуацию: любой человек, узнавший адрес, сможет выполнять действия в базе от имени указанного пользователя. Чтобы минимизировать угрозы, необходимо выполнить следующие настройки безопасности:
HTTP-сервиса. Назначьте эту роль пользователю WebUser..vrd анонимной публикации в секции httpServices оставьте параметр publish="true" только для тех сервисов, которые реально должны быть публичными. Для всех остальных установите false или удалите их из списка.PublicServices только списком доверенных IP-адресов, если это возможно.Если создание нескольких публикаций кажется избыточным, можно рассмотреть альтернативный вариант — проверку ключа доступа (API-Key) непосредственно в коде 1С. В этом случае мы публикуем сервис с анонимным доступом (через .vrd), но внутри каждого метода пишем проверку входящего заголовка.
Выясним причину, почему это удобно: вы можете выдавать разные ключи разным контрагентам и блокировать их в справочнике без перезапуска веб-сервера. Посмотрим на пример кода внутри метода GET или POST HTTP-сервиса:
Функция СписокТоваровGet(Запрос)
// Извлекаем ключ из заголовков запроса
КлючДоступа = Запрос.Заголовки.Получить("X-API-Key");
Если Не КлючВалиден(КлючДоступа) Тогда
Ответ = Новый HTTPСервисОтвет(401);
Ответ.УстановитьТелоИзСтроки("Ошибка авторизации: неверный API-Key");
Возврат Ответ;
КонецЕсли;
// Логика получения данных...
Результат = ПолучитьДанныеДляЭкспорта();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(Результат);
Возврат Ответ;
КонецФункции
Функция КлючВалиден(ЗначениеКлюча)
// Здесь может быть поиск в справочнике "КлючиДоступа"
// Возвращаем Истина, если ключ найден и активен
Возврат Константы.СистемныйКлючДоступа.Получить() = ЗначениеКлюча;
КонецФункции
Важно помнить, что каждый вызов HTTP-сервиса через анонимную публикацию создает сеанс. Если обращений будет слишком много, это может привести к быстрому расходу лицензий 1С. Рассмотрим способы оптимизации этого процесса:
Во-первых, используйте пул соединений. В файле .vrd можно настроить параметры poolSize и poolTimeout. Это позволит веб-серверу переиспользовать уже созданные сеансы 1С для обработки новых запросов, что значительно ускоряет работу.
Во-вторых, при настройке анонимной публикации через .vrd, обратите внимание на параметр shm (shared memory). Если веб-сервер и кластер 1С находятся на одном физическом сервере, использование разделяемой памяти может сократить задержки на передачу данных между процессами.
В высоконагруженных системах часто применяют Nginx перед основным веб-сервером. Это решение позволяет реализовать еще более гибкую схему:
в Nginx можно настроить автоматическое добавление заголовка Authorization: Basic ... к запросам, идущим на определенные URL-адреса. Таким образом, для внешнего мира сервис будет выглядеть анонимным, но 1С будет получать запрос уже с данными авторизации. Это избавляет от необходимости хранить пароли в открытом виде в .vrd файлах и позволяет централизованно управлять безопасностью на уровне прокси-сервера.
Рассмотрим, как это может выглядеть в конфигурации Nginx:
location /myservice/public/ {
proxy_set_header Authorization "Basic d2VidXNlcjpwYXNzd29yZA=="; # Base64 от login:pass
proxy_pass http://1c_server/base_name/hs/myservice/;
}
Подводя итог, можно сказать, что выбор между несколькими публикациями, редактированием .vrd или использованием реверс-прокси зависит от требований к безопасности и масштабируемости вашей системы. Для большинства задач стандартного механизма с двумя публикациями и техническим пользователем в .vrd оказывается более чем достаточно.