Вводные
- Требуется реализовать аутентификацию и авторизацию внешних пользователей при доступе к HTTP сервисам 1С
- В 1С хранится только ключ связывания пользователя со спр. Партнеры
Вариант реализации
Развернуть сервис аутентификации Keycloack, который выдает access_token в формате JWT по предъявлению login и password
Поставить перед 1С HTTP публикацией прокси, который проверит JWT токен, при его валидности из него получит данные о правах доступа до конкретного сервиса и при наличии прав переадресует запрос к публикации.
Схема
Настройка Apache
В конфигурации добавил
- HTTP сервис "test_http"
- роль "ВнешнийПользователь" с правами доступа к ВнешнееСоединение и к HTTP сервису
- сервисный пользователь с ролью "ВнешнийПользователь"
В "/etc/apache2/ports.conf" заменил "Listen 80" на "Listen 127.0.0.1:8080"
Запуск GateKeeper
Скачиваю архив с релизом с https://github.com/gogatekeeper/gatekeeper, распаковываю, копирую файл "gatekeeper" в "/usr/bin"
Запускаю сервис с конфигурацией sudo gatekeeper --config gate_config.yml
Настраиваю KeyCloak
Создаю realm "onec_token", в нем создаю client "client_token" c типом public
Для GateKeeper обязателен параметр aud, делаю мапинг значений для clients в этот параметр
Источник: https://stackoverflow.com/questions/53550321/keycloak-gatekeeper-aud-claim-and-client-id-do-not-match
В ограничениях присутствуют группы, делаю их мапинг для clients
В realm создаю роль "client:test1" и группу "users", создаю пользователя добавляю его в группу и добавляю ему роль.
Изменяю длительность действия access_token с 5 мин до 1 часа, сделал для тестов.
Проверка ограничения
Отправляю запрос без аутентификации, получаю 401
Запросом к keycloack получаю токен
Из тела ответа беру значение access_token, добавляю его в bearer аутентификацию основного запроса, повторяю запрос, получаю в ответе идентификатор user.
Использую перенаправленные от GateKeeper заголовки авторизации.
При установке параметра "enable-authorization-header" передается весь токен в заголовок Authorization, но это может конфликтовать с авторизацией на уровне 1С.
Итог
За счет внешних сервисов можно организовать безопасный доступ к HTTP публикациям 1С.
Как организовать gatekeeper в качестве сервиса отдельный вопрос. Самое простое через docker. Возможно имеет смысл скомпоновать в один образ gatekeeper с WS компонентой 1С.
Проверку на подделку JWT не делал, тема отдельного блока тестов, думаю в данной реализации работает корректно.
Благодарю за внимание.
Вступайте в нашу телеграмм-группу Инфостарт