Налаштування авторизації через 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.com. Без цього віджет не буде працювати — 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.com/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 годин (бот, компонент, обробник, користувацьке поле, шаблон кнопки).







