Передача данных токена в Luxms BI

Как можно передать заголовок с данными токена в Luxms BI при его встраивании в сторонние сайты?

Для использования Luxms BI HTTP API из внешних сервисов необходимо использовать встроенный в Luxms BI OTP сервис (сервис одноразовых паролей). Получение такого пароля требует выполнения специального запроса с использованием имени пользователя из под которого будет выполняться взаимодействие с Luxms BI и специального ключа сервиса: SERVICE_KEY. Действие выдаваемого одноразового пароля ограничено определённым промежутком времени.

SERVICE_KEY задаётся в таблице otp.services, например:

INSERT INTO otp.services
(ident, description, service_key, ticket_ttl, allowed_ip_list, allowed_users, created, updated)
VALUES('_some_service', 'some external service', gen_random_uuid (), 60, '["127.0.0.1"]'::jsonb, '["user1"]'::jsonb, NOW(), NOW())

где:

ident – уникальный идентификатор сервиса OTP
description - описание
ticket_ttl – время действия одноразового пароля в секундах
allowed_ip_list — список IP с которых внешних сервис будет выполнять запрос за OTP
allowed_users — список имен пользователей (username)

Схема взаимодействия при встраивании Luxms BI в WEB страницы внешних систем:

Последовательность шагов:

  1. Пользователь открывает страницу, где в iFrame планируется встроить ресурс Luxms BI

  2. Серверная часть внешней системы в процессе обработки запроса пользователя обращается в Luxms BI. Выполняется POST запрос на сервер Luxms BI в формате:

https://<luxmsbi_host>/api/auth/otp/<api_path>

и телом запроса:

{
"login_as": "<login>", 
"service_key": "<service_key>"
}

Где (все поля обязательные):

  • login - имя пользователя Luxms BI из под которого выполняется авторизация
  • service_key - ключ внешнего сервиса

В запросе обязателен заголовок:

Content-Type: application/json

Пример вызова:

curl --data \
"{\"login_as\": \"login1\", \"service_key\": \"service_key1\"}" \
-H "Content-Type: application/json" \
"https://luxmsbi.host/api/auth/otp/api/v3/koob/cube"

'3. В случае успешного создания OTP в ответ будет возвращен JSON в формате:

{ "path": "/api/auth/otp/<api_path>?_otp=<otp>" }

Пример ответа:

{"path": "/api/auth/otp/api/v3/koob/cube?_otp=2d743b6e-460b-49bc-8af7-902c64f5e19c"}

'4. В ответ на пользовательский запрос 1 внешняя система должна отправить HTTP статус 307 и в заголовке Location: указать ссылку, полученную от подсистемы

Пример ответа:

HTTP/1.1 307 Temporary Redirect
Date: Thu, 07 Apr 2022 16:07:03 GMT
Content-Type: application/json; charset=utf-8
Location: https://luxmsbi.host/api/auth/otp/api/v3/koob/cube?_otp=2d743b6e-460b-49bc-8af7-902c64f5e19c

'5. Браузер пользователя автоматически переходит по специальной ссылке.

'6. Luxms BI распознаёт пользовательский одноразовый ключ доступа, проверяет его и в случае успешной проверки выдаёт браузеру пользователя стандартный сессионный ключ доступа (cookie) и перенаправляет браузер пользователя на требуемую страницу

'7. Браузер пользователя автоматически переходит на требуемую страницу.

Для авторизации через OTP, также надо использовать https протокол, либо проксировать трафик на внешний хост.

Для работы через https необходимо:

  • Выставить ключ “Конфигурация системы” → “otp.default.proto” в “https” в этом случае sameSite будет возвращить Non , но многие браузеры будут требовать https, подключение.
  • Выставить ключ “Конфигурация системы” → “luxmsbi.url.path.prefix”, в нем указать домен внешнего сайта/базовый url - “https://youDomain/
  • Подключить на внешний сайт/ресурс ssl сертификат и сертификат для Luxm ресурса, инструкция - Приложение 5. Настройка SSL для Web-приложения | Luxms wiki