Как настроить авторизацию в веб-клиенте 1С через OAuth/OpenID Connect с автоматическим созданием пользователей и контролем лицензий?

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

Развертывание публичных демонстрационных баз 1С, доступных через веб-клиент, накладывает на разработчика ряд специфических задач. С одной стороны, пользователям нужно предоставить максимально простой и бесшовный вход (желательно в один клик через сторонние сервисы по протоколам OAuth 2.0 / OpenID Connect). С другой стороны, необходимо автоматически создавать учетные записи для новых гостей «на лету», строго контролировать выделенный пул лицензий, вести детальные логи посещений и принудительно завершать неактивные сеансы.

В этой статье мы подробно разберем, как спроектировать надежную архитектуру авторизации, обойти ограничения платформы при автоматическом создании пользователей, настроить штатный механизм OpenID Connect и реализовать автоматический менеджмент сессий.

Архитектура решения: почему «прямой» путь опасен и как сделать правильно

Рассмотрим популярную ошибку проектирования. На первый взгляд кажется заманчивой идея напрямую записывать данные новых пользователей в СУБД (например, в системную таблицу users MS SQL или PostgreSQL). Проанализируем, почему делать этого категорически нельзя:

  1. Нарушение лицензионного соглашения: Любая прямая модификация таблиц базы данных 1С на уровне СУБД (минуя сервер приложений) строго запрещена фирмой 1С.
  2. Нарушение целостности данных: Структура хранения пользователей платформы сложна и закрыта. Она включает в себя хэши паролей, связи с системными таблицами и уникальные идентификаторы UUID. Любое прямое вмешательство гарантированно приведет к неработоспособности базы данных при очередном обновлении платформы или реструктуризации.

Единственным верным и безопасным путем является использование промежуточного шлюза авторизации (Proxy / Gatekeeper) в связке с официальным прикладным программным интерфейсом платформы (API). Схема взаимодействия выглядит следующим образом:

  1. Пользователь заходит на демонстрационный лендинг или портал и нажимает кнопку «Войти через Google / Keycloak / Госуслуги».
  2. Внешний сервис авторизации (Identity Provider, IdP) проверяет подлинность пользователя и возвращает токен.
  3. Шлюз авторизации перехватывает этот токен, извлекает из него информацию о пользователе (например, email или уникальный ID) и отправляет запрос в саму базу 1С через специально опубликованный защищенный HTTP-сервис.
  4. Код 1С внутри HTTP-сервиса под служебной учетной записью с административными правами программно создает или обновляет карточку пользователя.
  5. Шлюз перенаправляет пользователя на публикацию веб-клиента 1С, где срабатывает бесшовная сквозная авторизация.

Штатная настройка OpenID Connect (OIDC) в 1С:Предприятии

Современные версии платформы 1С:Предприятие (начиная с 8.3.22) поддерживают полноценный протокол OpenID Connect «из коробки» на уровне веб-сервера. Нам больше не нужно писать собственные сложные парсеры токенов на стороне 1С. Для интеграции веб-клиента с вашим провайдером авторизации (например, Keycloak) необходимо отредактировать файл публикации базы данных default.vrd.

Рассмотрим пример конфигурации блока <openidconnect> в файле default.vrd:


<openidconnect>
    <enabled>true</enabled>
    <issuer>https://auth.mycompany.ru/auth/realms/demo</issuer>
    <clientId>1c-web-client</clientId>
    <clientSecret>your-client-secret-key</clientSecret>
    <usernameClaim>email</usernameClaim>
</openidconnect>

Разберем параметры конфигурации подробнее:

  1. issuer — адрес вашего провайдера авторизации (IdP), предоставляющего метаданные OIDC.
  2. clientId — идентификатор клиента 1С, зарегистрированный в панели управления IdP.
  3. usernameClaim — поле в JWT-токене, значение которого платформа будет сопоставлять с именем пользователя в 1С (в нашем примере это email).

В самой 1С у пользователей должен быть установлен флаг «Аутентификация OpenID Connect». Начиная с версии 8.3.22, вы также можете использовать программное свойство КлючиСопоставленияПользователя, чтобы гибко связывать одну учетную запись 1С с различными идентификаторами из внешних систем.

Реализация автоматического создания пользователей (Provisioning)

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

Посмотрим на пример кода метода POST нашего HTTP-сервиса, который принимает данные пользователя от шлюза авторизации и создает учетную запись программными средствами 1С:


Функция СоздатьИлиОбновитьПользователя(Запрос)
    
    // Десериализуем входящий JSON с данными пользователя
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку());
    ДанныеПользователя = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    ИмяПользователя = СокрЛП(ДанныеПользователя.Email);
    ПолноеИмя       = СокрЛП(ДанныеПользователя.FullName);
    
    Если ПустаяСтрока(ИмяПользователя) Тогда
        Ответ = Новый HTTPСервисОтвет(400);
        Ответ.УстановитьТелоИзСтроки("Не указан Email пользователя");
        Возврат Ответ;
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Истина);
    
    // 1. Создаем пользователя информационной базы (системный уровень)
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
    Если ПользовательИБ = Неопределено Тогда
        ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
    КонецЕсли;
    
    ПользовательИБ.Имя = ИмяПользователя;
    ПользовательИБ.ПолноеИмя = ПолноеИмя;
    ПользовательИБ.АутентификацияOpenIDConnect = Истина;
    ПользовательИБ.АутентификацияСтандартная = Ложь;
    ПользовательИБ.ПоказыватьВСпискеВыбора = Ложь;
    
    // Назначаем базовую роль для демо-входа
    РольДемо = Метаданные.Роли.ДемоДоступ;
    Если ПользовательИБ.Роли.Содержит(РольДемо) = Ложь Тогда
        ПользовательИБ.Роли.Добавить(РольДемо);
    КонецЕсли;
    
    Попытка
        ПользовательИБ.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("АвторизацияOIDC", УровеньЖурналаРегистрации.Ошибка,,, 
            "Ошибка создания пользователя ИБ: " + ОписаниеОшибки());
        Ответ = Новый HTTPСервисОтвет(500);
        Возврат Ответ;
    КонецПопытки;
    
    // 2. Создаем или обновляем элемент в прикладном справочнике "Пользователи" (если применимо)
    // Разберем этот шаг, так как большинство типовых конфигураций (БСП) требуют наличия элемента в справочнике
    СсылкаНаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
    Если СсылкаНаПользователя.Пустая() Тогда
        НовыйПользовательСпр = Справочники.Пользователи.СоздатьЭлемент();
        НовыйПользовательСпр.Наименование = ПолноеИмя;
        НовыйПользовательСпр.ИдентификаторПользователяИБ = ПользовательИБ.UuID; // Для версий БСП
        НовыйПользовательСпр.Записать();
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Ложь);
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки("Пользователь успешно подготовлен");
    Возврат Ответ;
    
КонецФункции

Управление лимитами лицензий, очередями и сеансами

В сценарии с публичной демонстрационной базой количество доступных лицензий всегда ограничено. Если наплыв пользователей велик, мы рискуем быстро исчерпать весь пул клиентских лицензий, из-за чего новые клиенты увидят системное окно об ошибке. Рассмотрим, как эффективно управлять лицензиями и сессиями.

Шаг 1. Настройка времени засыпания и завершения неактивных сеансов в веб-публикации.

Самый простой способ освободить зависшие лицензии — настроить автоматическое усыпление неактивных веб-клиентов. В том же файле default.vrd внутри секции <point> мы можем настроить параметры времени жизни сессий:


<point ...>
    <sessionMaxAge>1200</sessionMaxAge>
    <sessionTimeout>300</sessionTimeout>
</point>

Шаг 2. Использование возможностей самообслуживания платформы (8.3.24+).

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

Шаг 3. Жесткое вытеснение пользователей через RAS/RAC.

Если нам необходимо принудительно контролировать общее количество активных пользователей в демо-базе и кикать тех, кто превысил лимит времени (например, давать каждому пользователю ровно 30 минут на ознакомление), мы должны задействовать сервер администрирования 1С (RAS) и консольную утилиту RAC.

Мы можем написать скрипт (например, на Python или PowerShell) на сервере приложений, который будет запускаться по расписанию раз в минуту. Алгоритм работы скрипта:

  1. Опросить список активных сеансов базы данных через команду: rac session list --cluster=<ИД_Кластера> --infobase=<ИД_Базы>
  2. Для каждого сеанса проанализировать параметры started-at (время запуска сеанса) и last-active-at (время последней активности).
  3. Если общее количество сессий превышает лимит лицензий, или если конкретный пользователь находится в базе дольше лимита (например, 1800 секунд), скрипт выполняет команду принудительного завершения сеанса: rac session terminate --cluster=<ИД_Кластера> --session=<ИД_Сеанса>
  4. При этом шлюз авторизации на веб-портале фиксирует освобождение лицензии и пускает следующего пользователя из очереди.

Ведение логов и аудит активности пользователей

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

В модуле управляемого приложения проанализируем ситуацию в процедуре ПриНачалеРаботыСистемы:


Процедура ПриНачалеРаботыСистемы()
    
    // Проверим, что сеанс открыт именно через веб-клиент
    #Если ВебКлиент Тогда
        
        // Зафиксируем событие в Журнале Регистрации
        ИмяТекущегоПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
        
        ПараметрыЗаписи = Новый Структура;
        ПараметрыЗаписи.Вставить("Пользователь", ИмяТекущегоПользователя);
        ПараметрыЗаписи.Вставить("ВремяВхода", ТекущаяДата());
        
        ЗаписьЖурналаРегистрации(
            "ДемоДоступ.ВходПользователя",
            УровеньЖурналаРегистрации.Информация,
            Метаданные.HTTPСервисы.ДемоАвторизация, // Связываем с метаданными сервиса
            ,
            "Пользователь " + ИмяТекущегоПользователя + " успешно зашел в веб-клиент."
        );
        
    #КонецЕсли
    
КонецПроцедуры

Спроектированное таким образом решение гарантирует стабильную, безопасную и полностью легальную работу демонстрационной базы 1С с авторизацией по современным протоколам OpenID Connect / OAuth 2.0. Вы сможете гибко масштабировать пул лицензий, автоматически регистрировать пользователей и не беспокоиться о зависших сессиях веб-клиентов.

← На главную