Настройка авторизации через Telegram 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка авторизации через Telegram 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка авторизации через Telegram 1С-Битрикс

Telegram Login Widget — официальный механизм Telegram для авторизации на сторонних сайтах. В отличие от OAuth-провайдеров (ВКонтакте, Google), он работает по собственному протоколу: данные пользователя передаются через хэш HMAC-SHA256 с ключом из токена бота. В 1С-Битрикс стандартного модуля для Telegram-авторизации нет, поэтому интеграция делается вручную или через сторонний модуль.

Схема работы Telegram Login Widget

  1. На странице авторизации размещается виджет Telegram (скрипт telegram.org/js/telegram-widget.js).
  2. Пользователь нажимает кнопку, подтверждает в приложении Telegram, что доверяет сайту.
  3. Telegram передаёт на callback URL (или в JS-callback) объект с полями: id, first_name, last_name, username, photo_url, auth_date, hash.
  4. Сервер проверяет подпись: строит data-check-string из всех полей (кроме hash), вычисляет HMAC-SHA256 с ключом SHA256(bot_token) и сравнивает с hash.
  5. Проверяет auth_date — не старее 86400 секунд (защита от replay-атак).
  6. После проверки — авторизует или регистрирует пользователя.

Создание бота

Авторизационный виджет привязан к 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 часов (бот, компонент, обработчик, пользовательское поле, шаблон кнопки).