Как реализовать одновременный анонимный и авторизованный доступ к HTTP-сервисам 1С?

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

При интеграции 1С с внешними системами часто возникает задача: предоставить открытый доступ к одним методам HTTP-сервисов (например, для получения публичного прайс-листа или статуса заказа) и при этом строго ограничить доступ к другим методам (например, для создания документов или работы с персональными данными). В рамках этой статьи мы разберем, как реализовать гибридную схему авторизации для одной информационной базы, используя механизмы публикации на веб-сервере.

Разделение доступа через создание нескольких публикаций

Самый надежный и стандартный способ решения задачи — создание двух и более независимых публикаций информационной базы на одном веб-сервере (IIS или Apache). Рассмотрим подробнее, как это работает. Каждая публикация представляет собой отдельный виртуальный каталог в веб-сервере, со своим собственным конфигурационным файлом .vrd. Это позволяет нам настроить один каталог на обязательную авторизацию пользователя, а второй — на автоматический вход под технической учетной записью.

Для начала разберем по шагам процесс создания второй публикации:

  1. Откроем Конфигуратор 1С:Предприятия под правами администратора.
  2. Перейдем в меню Администрирование — Публикация на веб-сервере.
  3. В поле Имя укажем новое уникальное имя (например, PublicServices), отличное от основной публикации.
  4. В поле Каталог выберем отдельную папку на диске сервера. Важно: для каждой публикации должен быть свой физический каталог.
  5. На вкладке HTTP-сервисы отметим флажками только те сервисы, которые должны быть доступны без авторизации.
  6. Нажмем кнопку Опубликовать.

Настройка анонимного входа через файл vrd

После того как мы создали отдельную публикацию, нам необходимо «научить» её заходить в 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=&quot;ServerName&quot;;Ref=&quot;BaseName&quot;;Usr=&quot;WebUser&quot;;Pwd=&quot;SecretPass&quot;;">
    <httpServices>
        <service name="OpenData" alias="opendata.1cws" publish="true"/>
    </httpServices>
</point>

В данном примере мы добавили параметры Usr (имя пользователя в 1С) и Pwd (его пароль). Теперь при обращении к адресу http://server/PublicServices/hs/OpenData веб-сервер будет автоматически авторизоваться в 1С от имени WebUser.

Обеспечение безопасности анонимной публикации

Разумеется, создание «беспарольной» точки входа несет определенные риски. Проанализируем ситуацию: любой человек, узнавший адрес, сможет выполнять действия в базе от имени указанного пользователя. Чтобы минимизировать угрозы, необходимо выполнить следующие настройки безопасности:

  1. Минимальные права: Создайте в 1С специальную роль, в которой разрешено только чтение необходимых объектов и использование конкретного HTTP-сервиса. Назначьте эту роль пользователю WebUser.
  2. Ограничение состава публикации: В файле .vrd анонимной публикации в секции httpServices оставьте параметр publish="true" только для тех сервисов, которые реально должны быть публичными. Для всех остальных установите false или удалите их из списка.
  3. Фильтрация по IP-адресам: Средствами самого веб-сервера (IIS или Apache) ограничьте доступ к виртуальному каталогу PublicServices только списком доверенных IP-адресов, если это возможно.

Использование внутреннего API-Key для контроля доступа

Если создание нескольких публикаций кажется избыточным, можно рассмотреть альтернативный вариант — проверку ключа доступа (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 перед основным веб-сервером. Это решение позволяет реализовать еще более гибкую схему: в 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 оказывается более чем достаточно.

← На главную