Реализовать вход на сайт через Telegram можно двум

Реализовать вход на сайт через Telegram можно двумя основными путями: официальным виджетом (пользователь нажимает кнопку на сайте и подтверждает вход) или через генерацию одноразового кода/QR-кода внутри самого бота.

Ниже подробно описан самый простой и стандартный вариант — официальный виджет авторизации Telegram (Telegram Login Widget).

Шаг 1. Создание и настройка бота

Для работы авторизации вам обязательно нужен Telegram-бот, к которому будет привязан домен вашего сайта.

  1. Найдите официального бота @BotFather в Telegram и запустите его.

  2. Создайте нового бота с помощью команды /newbot, задайте ему имя и уникальный юзернейм (например, my_site_auth_bot).

  3. Привяжите домен сайта к боту:

    • Отправьте команду /setdomain.

    • Выберите вашего бота.

    • Введите адрес вашего сайта (например, https://example.com).

    Примечание: Для локального тестирования можно указать https://localhost или http://127.0.0.1, но Telegram требует наличие HTTPS для основного продакшн-домена.

Шаг 2. Получение кода виджета для сайта

Telegram предоставляет готовый конструктор кнопок.

  1. Перейдите на официальную страницу Telegram Login Widget.

  2. В секции конфигуратора введите юзернейм вашего бота (без символа @), выберите размер кнопки, отображение аватарки и тип авторизации:

    • Callback Request — данные будут переданы в JavaScript-функцию прямо на странице.

    • Redirect to URL — пользователь после авторизации будет перенаправлен на указанный URL (например, https://example.com/tg_auth.php), куда GET-запросом придут параметры пользователя.

  3. Скопируйте сгенерированный скрипт и вставьте его в HTML-код вашей страницы входа.

Пример кода кнопки с редиректом:

HTML
<script async src="https://telegram.org/js/telegram-widget.js?22" 
        data-telegram-login="ИМЯ_ВАШЕГО_БОТА" 
        data-size="large" 
        data-auth-url="https://example.com/tg_auth.php" 
        data-request-access="write"></script>

(Параметр data-request-access="write" необязателен, но он позволяет боту отправлять сообщения пользователю в будущем).

Шаг 3. Обработка данных на сервере (Безопасность)

Когда пользователь нажимает кнопку и разрешает вход, Telegram перенаправляет его на ваш скрипт (в примере — tg_auth.php) и передает в GET-параметрах данные профиля: id, first_name, username, photo_url, auth_date и hash.

Критически важно проверить подлинность этих данных, чтобы злоумышленник не мог подделать id и войти в чужой аккаунт.

Алгоритм проверки безопасности (на примере PHP):

  1. Собираются все полученные параметры (кроме hash), сортируются по алфавиту и склеиваются в строку формата key=value, разделенные переносом строки (\n).

  2. Создается секретный ключ: берется SHA256-хэш от токена вашего бота (который выдал @BotFather).

  3. Вычисляется HMAC-SHA256 от склеенной строки данных с использованием секретного ключа.

  4. Полученный результат сравнивается с параметром hash, который прислал Telegram. Если они совпадают — данные подлинные.

PHP
<?php
define('BOT_TOKEN', 'YOUR_BOT_TOKEN_HERE'); // Токен вашего бота

$auth_data = $_GET;
$check_hash = $auth_data['hash'];
unset($auth_data['hash']);

// 1. Сортируем параметры
$data_check_arr = [];
foreach ($auth_data as $key => $value) {
    $data_check_arr[] = $key . '=' . $value;
}
sort($data_check_arr);
$data_check_string = implode("\n", $data_check_arr);

// 2. Создаем секретный ключ из токена бота
$secret_key = hash('sha256', BOT_TOKEN, true);

// 3. Вычисляем хэш строки данных
$hash = hash_hmac('sha256', $data_check_string, $secret_key);

// 4. Проверяем валидность и актуальность данных (auth_date не должна быть слишком старой)
if (strcmp($hash, $check_hash) !== 0) {
    die('Ошибка: Данные подделаны!');
}

if ((time() - $auth_data['auth_date']) > 86400) {
    die('Ошибка: Сессия авторизации истекла.');
}

// Данные верны! Теперь можно авторизовать пользователя на сайте
// $tg_id = $auth_data['id'];
// $username = $auth_data['username'];

echo "Привет, " . htmlspecialchars($auth_data['first_name']) . "!";
// Здесь вы открываете сессию (session_start()) и записываете пользователя в БД
?>

Альтернативный способ (Через код/ссылку)

Если стандартный виджет вам не подходит (например, вы хотите, чтобы пользователь авторизовался, сканируя QR-код или переходя в Telegram по ссылке типа t.me/your_bot?start=уникальный_код):

  1. При клике на кнопку «Войти через Telegram» ваш сайт генерирует случайный уникальный токен (токен авторизации) и сохраняет его в базу данных со статусом «ожидает».

  2. Сайт показывает пользователю ссылку на бота вида https://t.me/my_bot?start=УНИКАЛЬНЫЙ_ТОКЕН.

  3. Пользователь переходит в бота и нажимает Запустить (Start).

  4. Ваш бэкенд-код бота принимает команду /start УНИКАЛЬНЫЙ_ТОКЕН, достает id пользователя Telegram и обновляет запись в БД вашего сайта: связывает этот токен с Telegram-аккаунтом и меняет статус на «авторизован».

  5. Сайт (который в этот момент проверяет статус токена через AJAX/WebSockets) видит, что статус изменился, и автоматически впускает пользователя в личный кабинет.