Реализовать вход на сайт через Telegram можно двумя основными путями: официальным виджетом (пользователь нажимает кнопку на сайте и подтверждает вход) или через генерацию одноразового кода/QR-кода внутри самого бота.
Ниже подробно описан самый простой и стандартный вариант — официальный виджет авторизации Telegram (Telegram Login Widget).
Шаг 1. Создание и настройка бота
Для работы авторизации вам обязательно нужен Telegram-бот, к которому будет привязан домен вашего сайта.
-
Найдите официального бота @BotFather в Telegram и запустите его.
-
Создайте нового бота с помощью команды
/newbot, задайте ему имя и уникальный юзернейм (например,my_site_auth_bot). -
Привяжите домен сайта к боту:
-
Отправьте команду
/setdomain. -
Выберите вашего бота.
-
Введите адрес вашего сайта (например,
https://example.com).
Примечание: Для локального тестирования можно указать
https://localhostилиhttp://127.0.0.1, но Telegram требует наличие HTTPS для основного продакшн-домена. -
Шаг 2. Получение кода виджета для сайта
Telegram предоставляет готовый конструктор кнопок.
-
Перейдите на официальную страницу Telegram Login Widget.
-
В секции конфигуратора введите юзернейм вашего бота (без символа
@), выберите размер кнопки, отображение аватарки и тип авторизации:-
Callback Request — данные будут переданы в JavaScript-функцию прямо на странице.
-
Redirect to URL — пользователь после авторизации будет перенаправлен на указанный URL (например,
https://example.com/tg_auth.php), куда GET-запросом придут параметры пользователя.
-
-
Скопируйте сгенерированный скрипт и вставьте его в 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):
-
Собираются все полученные параметры (кроме
hash), сортируются по алфавиту и склеиваются в строку форматаkey=value, разделенные переносом строки (\n). -
Создается секретный ключ: берется SHA256-хэш от токена вашего бота (который выдал @BotFather).
-
Вычисляется HMAC-SHA256 от склеенной строки данных с использованием секретного ключа.
-
Полученный результат сравнивается с параметром
hash, который прислал Telegram. Если они совпадают — данные подлинные.
<?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=уникальный_код):
-
При клике на кнопку «Войти через Telegram» ваш сайт генерирует случайный уникальный токен (токен авторизации) и сохраняет его в базу данных со статусом «ожидает».
-
Сайт показывает пользователю ссылку на бота вида
https://t.me/my_bot?start=УНИКАЛЬНЫЙ_ТОКЕН. -
Пользователь переходит в бота и нажимает Запустить (Start).
-
Ваш бэкенд-код бота принимает команду
/start УНИКАЛЬНЫЙ_ТОКЕН, достаетidпользователя Telegram и обновляет запись в БД вашего сайта: связывает этот токен с Telegram-аккаунтом и меняет статус на «авторизован». -
Сайт (который в этот момент проверяет статус токена через AJAX/WebSockets) видит, что статус изменился, и автоматически впускает пользователя в личный кабинет.