Настройка авторизации через Telegram 1С-Битрикс
Telegram Login Widget — официальный механизм Telegram для авторизации на сторонних сайтах. В отличие от OAuth-провайдеров (ВКонтакте, Google), он работает по собственному протоколу: данные пользователя передаются через хэш HMAC-SHA256 с ключом из токена бота. В 1С-Битрикс стандартного модуля для Telegram-авторизации нет, поэтому интеграция делается вручную или через сторонний модуль.
Схема работы Telegram Login Widget
- На странице авторизации размещается виджет Telegram (скрипт
telegram.org/js/telegram-widget.js). - Пользователь нажимает кнопку, подтверждает в приложении Telegram, что доверяет сайту.
- Telegram передаёт на callback URL (или в JS-callback) объект с полями:
id,first_name,last_name,username,photo_url,auth_date,hash. - Сервер проверяет подпись: строит
data-check-stringиз всех полей (кромеhash), вычисляет HMAC-SHA256 с ключомSHA256(bot_token)и сравнивает сhash. - Проверяет
auth_date— не старее 86400 секунд (защита от replay-атак). - После проверки — авторизует или регистрирует пользователя.
Создание бота
Авторизационный виджет привязан к Telegram-боту. Создать бота: @BotFather → /newbot. Затем передать домен сайта: /setdomain → @your_bot → your-site.ru. Без этого виджет не будет работать — Telegram проверяет origin запроса.
Токен бота используется только на сервере для проверки подписи. Никогда не выдавайте токен на фронтенд.
Реализация в Битрикс
Создаём компонент /local/components/custom/telegram.auth/. В шаблоне компонента размещаем виджет:
<script async src="https://telegram.org/js/telegram-widget.js?22"
data-telegram-login="your_bot_name"
data-size="large"
data-auth-url="https://your-site.ru/auth/telegram/callback/"
data-request-access="write">
</script>
Обработчик callback (/local/php_interface/include/auth/telegram_callback.php или через роутер Битрикс):
\Bitrix\Main\Loader::includeModule('main');
$data = $_GET;
$hash = $data['hash'];
unset($data['hash']);
ksort($data);
$checkString = implode("\n", array_map(fn($k, $v) => "$k=$v", array_keys($data), $data));
$secretKey = hash('sha256', $botToken, true);
$computedHash = hash_hmac('sha256', $checkString, $secretKey);
if (!hash_equals($computedHash, $hash)) {
// Невалидная подпись
LocalRedirect('/auth/?error=invalid_signature');
}
if ((time() - (int)$data['auth_date']) > 86400) {
LocalRedirect('/auth/?error=expired');
}
// Ищем пользователя по Telegram ID в пользовательском поле или таблице
$telegramId = (int)$data['id'];
$user = \Bitrix\Main\UserTable::getList([
'filter' => ['UF_TELEGRAM_ID' => $telegramId],
'select' => ['ID'],
'limit' => 1,
])->fetch();
if ($user) {
// Авторизуем
$GLOBALS['USER']->Authorize($user['ID']);
} else {
// Регистрируем нового пользователя
$newUser = new CUser();
$userId = $newUser->Add([
'LOGIN' => 'tg_' . $telegramId,
'NAME' => $data['first_name'] ?? '',
'LAST_NAME' => $data['last_name'] ?? '',
'ACTIVE' => 'Y',
'PASSWORD' => randString(20),
'UF_TELEGRAM_ID' => $telegramId,
]);
$GLOBALS['USER']->Authorize($userId);
}
LocalRedirect('/personal/');
Поле UF_TELEGRAM_ID создаётся через Настройки → Пользователи → Пользовательские поля с типом «Целое число».
Типичные проблемы
-
«Bot domain invalid» — не прописан домен в
@BotFather. Домен указывается без протокола и слеша. -
«Hash invalid» — на сервере используется
$_GETвместо верифицированных данных, или к данным добавляются лишние поля. - Работает только по HTTPS — Telegram Widget требует SSL на целевом домене.
Сроки выполнения
Реализация Telegram-авторизации с нуля: 4–6 часов (бот, компонент, обработчик, пользовательское поле, шаблон кнопки).







