← Все статьи
Сравнение

Telegram Webhook secret_token и HMAC: что проверять на стороне получателя

secret_token в Telegram Bot API — не HMAC-подпись. После настройки через setWebhook Telegram передаёт то же значение в заголовке X-Telegram-Bot-Api-Secret-Token. Получатель сравнивает его с настроенным токеном. В UnifyPort действует другой контракт: если подпись включена, нужно вычислить HMAC-SHA256 от временной метки и исходных байтов тела запроса, затем проверить X-Device-Signature. Эти проверки не взаимозаменяемы.

Главное различие

  • Заголовок Telegram содержит сам общий секрет, а не дайджест JSON-тела.
  • Подпись UnifyPort связывает исходное тело и X-Device-Timestamp с signing_secret конкретного endpoint.
  • Оба варианта требуют HTTPS, защиты секретов и идемпотентной обработки.
  • Способ проверки выбирают по доверенной конфигурации маршрута, а не по непроверенному полю provider или наличию произвольного заголовка.

Здесь речь об аутентификации запросов, а не о выборе типа аккаунта. Если вы ещё выбираете между ботом и существующим аккаунтом для переписки, начните со сравнения Telegram Bot API webhook и единого входящего webhook.

Что именно проверяет Telegram secret_token

В официальной документации Telegram Bot API secret_token описан как необязательный параметр setWebhook. Допустимая длина — 1–256 символов; разрешены A-Z, a-z, 0-9, _ и -. После настройки Telegram передаёт это значение в X-Telegram-Bot-Api-Secret-Token с каждым webhook-запросом.

Если получатель требует такую защиту, запрос без заголовка или с несовпадающим значением не должен попадать в доверенную очередь обработки. Совпадение подтверждает владение настроенным значением, но не создаёт отдельной криптографической связи между токеном и телом запроса.

Это особенно важно при использовании прокси или сервиса пересылки. Компонент, который видит токен, способен отправить тот же токен с другим телом. HTTPS защищает соединение, но статический заголовок сам по себе не обнаруживает изменение тела после завершения TLS-соединения на промежуточном узле. Это различие границ доверия, а не причина отказываться от официального Bot API.

Рекомендуется выделить отдельный секрет для webhook: не использовать вместо него токен бота и не вставлять его в публичные сервисы сбора запросов. Скрывайте значение в журналах доступа, выгрузках трассировок и скриншотах для поддержки.

Статический заголовок и подпись тела

HMAC — механизм аутентификации сообщений с общим секретным ключом. В документированном контракте UnifyPort получатель заново вычисляет дайджест заданных данных, а не сравнивает заголовок подписи с секретом напрямую.

ВопросTelegram Bot API webhookПодписанный webhook UnifyPort
НастройкаsetWebhook.secret_tokensigning_secret endpoint
Проверяемый заголовокX-Telegram-Bot-Api-Secret-TokenX-Device-Signature
Передаваемое значениеСам настроенный токенHMAC-SHA256 в шестнадцатеричном виде
Включено ли тело в проверку?НетДа, исходные байты
Включена ли временная метка?НетДа, X-Device-Timestamp
Действие получателяСравнить заголовок с токеномВычислить и сравнить дайджест
Гарантирует однократную обработку?НетНет

В UnifyPort подписывается строго следующая последовательность:

<X-Device-Timestamp>.<raw request body>

Временная метка имеет формат RFC 3339 UTC, разделитель — буквальная точка. Форматирование JSON, изменение пробелов или повторная сериализация после разбора могут изменить подписанные байты. signing_secret служит ключом HMAC, а не ожидаемым значением заголовка подписи.

При пустом signing_secret подпись UnifyPort отключена и X-Device-Signature не передаётся. Если получатель требует подписанные запросы, он должен отклонить такой запрос, а не незаметно переключаться на другой способ аутентификации.

Разделите входящие маршруты

Практичный вариант — отдельные маршруты приложения для нативных обновлений Telegram и событий UnifyPort. Это рекомендация по архитектуре приложения, а не новый endpoint провайдера.

  1. Закрепите отправителя и секрет за маршрутом. Ожидаемый механизм должен быть определён в конфигурации до приёма трафика.
  2. Проверяйте подлинность до передачи в обработку. Для Telegram проверяйте заголовок с токеном; для подписанного UnifyPort — HMAC исходного тела и допустимость временной метки.
  3. Проверяйте правильную структуру данных. Нативный Telegram Update нельзя передавать обработчику, ожидающему конверт UnifyPort message.received.
  4. Надёжно сохраняйте принятую работу. Аутентификация, идемпотентность и проверка бизнес-полномочий должны оставаться отдельными этапами.
  5. Записывайте причину отказа, а не секрет. В журнале достаточно указать, какая проверка не прошла.

Не используйте на общем маршруте правило «подходит любой из двух заголовков». Более слабая или случайно включённая ветка станет альтернативой запланированной политике проверки. В частности, токен Telegram не должен заменять обязательную HMAC-подпись на маршруте UnifyPort.

Подробности второго контракта разобраны в руководстве по защите HMAC от повторного воспроизведения и обработке повторных доставок. Время внутри JSON-сообщения не заменяет временную метку, защищённую подписью доставки.

Приёмочные проверки перед запуском

Ниже предложены тесты, а не результаты уже выполненного тестирования. Проводите их в изолированной среде с секретами под вашим контролем.

ПроверкаОжидаемое поведение получателя
Заголовок Telegram отсутствует или неверенОтклонить до доверенной обработки
Токен Telegram верен, тело измененоОдин заголовок не выявит изменение; нужны проверка данных и доверенная транспортная граница
Тело UnifyPort изменено после подписанияОтклонить из-за несовпадения дайджеста
Подпись UnifyPort верна, но время вне допустимого окнаОтклонить согласно политике свежести
Токен Telegram отправлен на маршрут UnifyPortОтклонить, не менять механизм проверки
Подлинное обычное событие доставлено повторноПринять идемпотентно, не повторяя бизнес-действие

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

Где полезен UnifyPort и каковы ограничения

Неофициальный интерфейс UnifyPort предоставляет нормализованные события подключённых аккаунтов для переписки. HMAC защищает участок от UnifyPort до вашего получателя. Это не нативная подпись Telegram и не сквозное доказательство авторства пользователя Telegram.

Если продукт уже работает как Telegram-бот, реализуйте документированную защиту Telegram на его входе. Менять платформу только ради другого механизма аутентификации не требуется. Если UnifyPort используется для очереди существующего аккаунта или нескольких каналов, следуйте его контракту и включайте подпись при создании webhook endpoint.

Частые вопросы

Нужно ли вычислять HMAC с Telegram secret_token?

Не для проверки документированного секретного заголовка Bot API. Сравните заголовок с настроенным токеном. Не придумывайте алгоритм подписи тела для заголовка, который передаёт сам токен.

Можно ли напрямую сравнить X-Device-Signature и signing_secret?

Нет. Вычислите HMAC-SHA256 от временной метки и исходного тела по правилам документации, затем сравните дайджест с полученной шестнадцатеричной подписью.

Предотвращает ли один из механизмов повторную обработку?

Нет. Аутентификация и устранение дублей — разные задачи. Сохраняйте принятую работу и делайте последующие действия идемпотентными. HMAC сам по себе не обеспечивает однократную доставку.

Следующий шаг и источники

Используйте справочник доставки webhook и проверки подписи как контракт реализации получателя UnifyPort.

Источники проверены 2026-09-17:

UnifyPort API

Превратите интеграцию сообщений в стабильный продуктовый pipeline.

Начните с отправки через единый API, затем возвращайте входящие сообщения в бизнес-систему стандартными событиями.