Backend
В качестве SmartApp backend выступает чат-бот, который реализует Bot API и умеет работать с BotX API. Bot API необходим для получения информации от SmartApp frontend и не содержит элементов авторизации. Взаимодействие между SmartApp frontend и BotX зашифровано. Для работы с BotX API чат-бот должен передавать токен авторизации в каждом запросе.
Примечание
Для создания чат-бота может использоваться любой язык программирования, поддерживающий получение и отправку HTTP-запросов. Для Python3 разработана библиотека pybotx, которая позволяет значительно ускорить создание новых чат-ботов.
Получение токена
Шаг 1. Создайте чат-бота в консоли администратора CTS-сервера.
-
Перейдите в раздел "Боты":
-
Нажмите на кнопку Создать бота.
-
В открывшемся окне заполните поля:
Название поля Описание App ID Уникальный текстовый идентификатор SmartApp URL Адрес, где развернут чат-бот Имя Название чат-бота. Для SmartApp данное поле заполнять не нужно Статус-сообщение Сообщение, которое будет выводиться создании чата с ботом. Для SmartApp данное поле заполнять не нужно Аватар Аватар чат-бота. Для SmartApp загружать аватар не нужно Версия протокола Версия протокола, которую будет использовать BotX при обращении к чат-боту. По умолчанию выбрана самая последняя -
Нажмите Сохранить.
Созданный чат-бот отобразится в разделе "Боты".
Шаг 2. Создайте подпись.
-
В разделе "Боты" консоли администратора CTS-сервера нажмите в строке созданного чат-бота.
-
В открывшемся окне скопируйте ID и secret key.
-
Создайте подпись, используя скопированные ID и secret key:
echo "bot_id secret_key" | python3 -c "import base64, hmac, hashlib; bot_id, secret_key = input().split(); signed_bot_id = hmac.new(key=secret_key.encode(), msg=bot_id.encode(), digestmod=hashlib.sha256).digest(); print(base64.b16encode(signed_bot_id).decode())"
Шаг 3. Получите токен.
Для получения токена вызовите соответствующий метод в BotX API с полученной подписью.
Время действия полученного токена не ограничено.
Взаимодействие SmartApp frontend и backend
Для взаимодействия frontend и backend (чат-бота) используется JSONRPC-подобный протокол SmartApp RPC. Взаимодействие асинхронно:
- Чат-бот получает системное событие
system:smartapp_event
, содержащее ID запроса (ref) методом POST на роут/command
. - Чат-бот подтверждает его обработку.
- Чат-бот формирует ответ и отправляет событие с тем же ref методом POST на роут
/notification/callback
. - SmartApp frontend получает и обрабатывает сообщение.
Пример отправки события:
Внимание!
В поле data можно передать произвольный JSON-объект, но размер запроса в BotX не должен превышать 1M!
POST https://{express-server}/api/v3/botx/smartapps/event
{
"ref": "6c4e232e-ce47-4141-9502-998bc0062523",
"data": {"foo": "bar"},
"group_chat_id": "8e81b23d-9d01-0934-0d99-9410d621353b",
"opts": {},
"smartapp_api_version": 1,
"smartapp_id": "0d7a43fa-6c4a-5842-b0ab-5e051921e18c"
}
POST https://{express-server}/api/v3/botx/smartapps/notification
{
"body": "Test",
"group_chat_id": "dec60c05-77b7-0d78-159e-b4fbee4d48f6",
"opts": {},
"smartapp_api_version": 1,
"smartapp_counter": 1
}
Получение статики SmartApp frontend
Статика хранится в SmartApp backend и выдается по запросу BotX по роутингу /smartapp_files/static/<path_to_file>
.
Передача файлов
Чат-бот принимает и отправляет метаданные файлов вместо самих файлов. После получения команды с метаданными файла чат-бот вызывает метод "Скачивание файла" для файла загрузки в файловую систему. Для отправки файла в SmartApp frontend, его необходимо предварительно загрузить методом "Загрузка файла" и отправить полученные метаданные в событии.
Аутентификация в интегрируемых сервисах
Чат-бот может быть самостоятельной информационной системой, но чаще выступает посредником для передачи информации между SmartApp frontend и интегрируемой системой. На схеме ниже представлена последовательность передачи запроса от SmartApp frontend в целевую систему:
Возможны два варианта авторизации в интегрируемой системе:
- сервисная учетная запись, которая позволяет выполнять действия для любого пользователя;
- single Sign On (SSO), построенный на базе Keyсloak.
SSO позволяет использовать пользовательскую авторизацию для доступа к интегрируемым ресурсам. В схеме SSO применяется Keycloak в качестве IDP для всех систем.
На схеме ниже показано, как запрос от SmartApp frontend обогащается токеном доступа (access token) пользователя. Это позволяет чат-боту использовать его для аутентификации в интегрируемой системе. Обновление токена осуществляется автоматически:
Примечание
Токен доступа передается в заголовке OPEN_ID_ACCESS_TOKEN
запроса от CTS к чат-боту. Данный заголовок будет передаваться, если в консоли администратора в настройках чат-бота включить опцию "Использовать OpenID токен для аутентификации бота":