Files
BitrixDealsBot/docs/adr/002-oauth-telegram-binding.md

3.4 KiB
Raw Permalink Blame History

ADR-002: привязка пользователей Битрикс24 и Telegram

Статус: Принято
Дата: 2026-07-23

Контекст

Локальное приложение CRM отправляет на HTTPS-адрес /bitrix/bind идентификационные данные пользователя и refresh-токен. Идентификаторам портала и пользователя из входной формы доверять нельзя: контекст должен быть получен от OAuth-сервера Битрикс24 и подтверждён методом user.current.

Решение

Сайт использует refresh-токен для получения новой OAuth-пары, доверенных member_id, user_id и client_endpoint. После этого BitrixClient сверяет user_id с результатом user.current.

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

Диаграмма последовательности привязки Битрикс24 к Telegram

Рисунок ADR-002/1. Диаграмма последовательности привязки Битрикс24 к Telegram

После проверки пользователя функцией secrets.token_urlsafe(32) формируется одноразовый токен привязки. В БД записывается только SHA-256-хеш, поэтому компрометация базы не позволяет восстановить действующую ссылку. Срок жизни задаётся переменной окружения BINDING_TOKEN_TTL_SECONDS, ограничен диапазоном от 60 до 3600 секунд и по умолчанию равен 600 секундам. При повторном выпуске прежние непогашенные токены того же пользователя отзываются.

Пользователь переходит по одноразовой ссылке в чат с Telegram-ботом. Бот повторно вычисляет SHA-256-хеш и сверяет его с активными токенами. Если токен существует, не истёк, не отозван и ещё не погашен, он помечается использованным, а в таблице привязок создаётся или обновляется связь пользователя Битрикс24 с аккаунтом Telegram.

Погашение выполняется только в личном чате. Проверка токена и изменение привязки выполняются функцией binding.consume_v1 в одной транзакции.

Последствия

Привязка не использует идентификаторы пользователя из недоверенной входной формы. В базе хранится только хеш одноразового токена, а повторный выпуск ссылки отзывает предыдущие непогашенные токены. Атомарное погашение не позволяет двум запросам одновременно использовать одну ссылку.