Если вы когда-нибудь регистрировались на сайте через Google или Apple — вы уже примерно понимаете, о чём речь. Telegram предлагает похожий механизм: пользователь нажимает кнопку, подтверждает вход в приложении и авторизуется. Никаких форм, паролей.
В этой статье посмотрим детальнее, как работает авторизация через Telegram, зачем она вообще нужна и как её подключить на практике.
Стоит сразу отметить, что недавно Telegram анонсировал официальный механизм авторизации. С помощью аккаунта мессенджера можно быстро зарегистрироваться или авторизоваться в приложении или на сайте. Пользователю достаточно поделиться с сайтом или ботом своим номером телефона.
Зачем это нужно и что получаете
Начнём с простого: зачем вообще делать вход через Telegram, если можно сделать обычную форму с логином и паролем.
- Конверсия растёт. Когда пользователь видит кнопку «Войти через Telegram» — он проходит авторизацию за несколько секунд. Не нужно придумывать пароль, подтверждать email, искать SMS с кодом.
- Верификация номера телефона — бесплатно. У каждого пользователя Telegram привязан номер телефона. Если нужен верифицированный контакт, этот способ как раз снижает расходы на SMS-подтверждение при регистрации.
- Прямой канал для общения. После авторизации появляется возможность писать пользователю через бота. Это удобно для уведомлений, подтверждений заказов, сервисных сообщений.
- Дополнительные возможности. Telegram поддерживает API и мини-приложения.
Как выглядит авторизация на сайте через Telegram
Сначала пройдём этот путь глазами обычного посетителя сайта.
- Пользователь открывает ваш сайт и видит кнопку «Войти через Telegram».
- Нажимает её — появляется всплывающее окно с предложением ввести номер телефона.
- На телефон приходит уведомление от Telegram с просьбой подтвердить вход.
- Пользователь нажимает «Принять» в приложении.
- Готово — он авторизован на вашем сайте.
Три-четыре нажатия, и человек пользуется сайтом или приложением. При этом он видит, через какого бота происходит вход. Поэтому важно, чтобы бот был узнаваемым: с логотипом вашего сервиса и понятным названием.
Два способа подключить Telegram авторизацию
Сегодня Telegram предлагает два подхода, и оба актуальны.
Способ 1: новый стандарт
Современный вариант на основе протокола OpenID Connect (Telegram Login Library). Если вы уже используете какой-нибудь OpenID Connect-совместимый инструмент (Keycloak, Auth0, Authentik), то интегрировать Telegram авторизацию будет несложно: подключаете как обычный провайдер.
Поток авторизации здесь стандартный (Authorization Code Flow). Вы получаете защищённый токен, который можно верифицировать криптографически.
Способ 2: классический виджет авторизации
Более старый вариант — встраиваемый виджет. Менее гибкий в плане кастомизации, но по-прежнему рабочий и хорошо документированный. Подходит, если вы хотите быстро добавить кнопку без глубокой интеграции.
Разберём оба подхода по шагам.
Как настроить авторизацию через Telegram
Подчеркнем, что весь код ниже представлен как пример и может полноценно не работать на вашей системе.
Шаг 1. Создаём и настраиваем бота
Без бота Telegram авторизация не работает. Бот — это технический инструмент и одновременно «лицо» авторизации: пользователь видит имя и аватарку в момент подтверждения входа.
Поэтому первое, что нужно сделать — убедиться, что бот выглядит как часть вашего сервиса. Поставьте логотип, дайте понятное название. Пользователь гораздо охотнее подтверждает вход, когда видит знакомый бренд, а не безымянного бота.
Чтобы создать или выбрать бота — зайдите в чат с @BotFather. Если бота ещё нет, создайте его командой /newbot. Если уже есть — выберите нужный из списка командой /mybots.
Скопируйте токен бота — он понадобится для настройки.
Шаг 2. Регистрируем адреса и получаем Client ID
Telegram не позволяет перенаправлять пользователей на произвольные URL — только на те, которые вы явно указали. Это защита от подделки авторизационных запросов.
Откройте мини-приложение @BotFather, зайдите в настройки бота: Bot Settings → Web Login. Здесь нужно добавить все адреса, где будет работать ваша авторизация:
- адреса сайтов, где будет встроена кнопка (например, https://example.com)
- callback-адреса для потока (например, https://example.com/auth/callback)
Там же BotFather покажет ваш Client ID и Client Secret — сохраните их в надёжном месте, они нужны для настройки OIDC-клиента.
Шаг 3. Добавляем кнопку на сайт
Через Telegram Login Library
Подключаете библиотеку, инициализируете SDK с вашими параметрами:
Telegram.Login.init({
client_id: ВАШ_CLIENT_ID,
request_access: ['phone']
}, function(data) {
if (data.error) {
console.error(data.error);
return;
}
// data.id_token содержит JWT с данными пользователя
// data.user — уже декодированные данные
});Метод Telegram.Login.open() открывает всплывающее окно авторизации.
Через классический виджет
Если вы используете старый подход с iframe, код выглядит примерно так:
<script
src="https://telegram.org/js/telegram-widget.js?2"
data-telegram-login="ИМЯ_ВАШЕГО_БОТА"
data-size="medium"
data-auth-url="https://example.com/auth/callback"
data-request-access="write">
</script>После нажатия кнопки Telegram либо перенаправит пользователя на data-auth-url с данными в GET-параметрах, либо вызовет JavaScript-функцию — зависит от того, какой тип авторизации вы выберете.
Шаг 4. Получаем и проверяем данные пользователя
После успешной авторизации вы получаете набор данных о пользователе:
- id — уникальный идентификатор в Telegram
- first_name, last_name — имя и фамилия
- username — никнейм (если указан)
- photo_url — ссылка на аватарку
- phone_number — номер телефона (если запрошен и подтверждён)
- auth_date — дата авторизации
- hash — криптографическая подпись
Важный момент: нужно убедиться, что данные действительно пришли от Telegram, а не были подделаны.
Проверка подписи на PHP
function checkTelegramAuthorization($auth_data) {
$check_hash = $auth_data['hash'];
unset($auth_data['hash']);
$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);
$secret_key = hash('sha256', BOT_TOKEN, true);
$hash = hash_hmac('sha256', $data_check_string, $secret_key);
if (strcmp($hash, $check_hash) !== 0) {
throw new Exception('Данные не от Telegram');
}
if ((time() - $auth_data['auth_date']) > 86400) {
throw new Exception('Данные устарели');
}
return $auth_data;
}Проверка подписи на Python
import hashlib
import hmac
def verify_telegram_login_hash(data: dict, bot_token: str) -> bool:
check_hash = data.pop('hash')
data_check_string = "\n".join(
f"{k}={v}" for k, v in sorted(data.items()) if v is not None
)
secret_key = hashlib.sha256(bot_token.encode()).digest()
computed = hmac.new(secret_key, data_check_string.encode(), hashlib.sha256).hexdigest()
return hmac.compare_digest(computed, check_hash)Логика в обоих случаях одна: берём все поля кроме hash, сортируем их в алфавитном порядке, склеиваем в строку через \n, вычисляем HMAC-SHA-256 с ключом на основе токена бота и сравниваем с переданным hash. Если совпало — данные подлинные.
Дополнительно стоит проверить auth_date — если прошло больше суток, данные считаются устаревшими.
Шаг 5. Работаем с токеном (для OIDC-подхода)
Если вы используете новый OIDC-поток, Telegram возвращает не просто набор параметров, а полноценный JWT-токен (id_token). После успешной авторизации декодированный токен выглядит так:
{
"iss": "https://oauth.telegram.org",
"aud": "123456789",
"sub": "1234123412341234123",
"iat": 1700000000,
"exp": 1700003600,
"name": "Иван Петров",
"preferred_username": "ivanpetrov",
"picture": "https://cdn4.telesco.pe/file/...",
"phone_number": "79991234567"
}Перед тем как доверять этим данным, нужно верифицировать токен на стороне сервера. Алгоритм такой:
- Загружаем публичные ключи Telegram с https://oauth.telegram.org/.well-known/jwks.json
- Проверяем подпись токена
- Убеждаемся, что iss — это https://oauth.telegram.org, aud совпадает с вашим Bot ID, и срок действия (exp) не истёк
После успешной верификации можно смело сохранять данные пользователя в базу и создавать сессию.
Реализация на FastAPI: пример с белым списком
Если вы хотите ограничить доступ к сайту только для конкретных пользователей, можно построить систему на основе белого списка Telegram ID. Вот как это выглядит в общих чертах на FastAPI.
Создаёте обработчик callback:
@auth_router.get('/telegram-callback')
async def telegram_callback(request: Request, user_id: int, query_hash: str, next_url: str = '/'):
# Проверяем подпись
params = request.query_params.items()
data_check_string = '\n'.join(sorted(f'{k}={v}' for k, v in params if k not in ('hash', 'next')))
computed_hash = hmac.new(BOT_TOKEN_HASH.digest(), data_check_string.encode(), 'sha256').hexdigest()
if not hmac.compare_digest(computed_hash, query_hash):
return PlainTextResponse('Ошибка авторизации', status_code=401)
# Создаём JWT и ставим куки
token = jwt.encode({'alg': 'HS256'}, {'k': user_id}, JWT_SECRET_KEY)
response = RedirectResponse(next_url)
response.set_cookie(key='auth-token', value=token)
return responseА в middleware проверяете куки при каждом запросе: если токена нет или он невалидный — показываете страницу входа. Если ID есть в белом списке — пропускаете.
Такой подход хорошо работает для закрытых сервисов, внутренних инструментов или тематических сообществ, где нужно пускать только «своих».
Двухфакторная авторизация Telegram: в чём разница
Стоит разграничить два разных понятия, которые часто путают.
- Двухфакторная авторизация — это настройка внутри самого Telegram, когда вы защищаете свой аккаунт дополнительным паролем. К виджету для сайтов она отношения не имеет.
- Авторизация на сайте через Telegram — когда ваш сайт использует Telegram как провайдер идентификации. Пользователь подтверждает вход в приложении, и этого достаточно.
Если вы хотите добавить второй фактор именно для входа на ваш сайт — можно использовать отправку кодов подтверждения. Для этого хорошо подходят специализированные сервисы.
Коды подтверждения и другие каналы связи
Telegram запрашивает авторизацию через само приложение, это удобно. Но не всегда достаточно. Иногда нужно дополнительно подтвердить действие: вход с нового устройства, смену пароля, иные действия.
Для таких сценариев используют коды подтверждения, можно задействовать разные каналы в зависимости от ситуации.
Notificore — платформа, которая позволяет отправлять коды подтверждения через Telegram, SMS, email и голосовые звонки. Это удобно, когда вам нужна гибкость: если пользователь недоступен в одном канале, сообщение уйдёт через другой.
- Telegram API — код приходит прямо в мессенджер, которым пользователь уже пользуется.
- SMS — универсальный вариант, работает даже без интернета и без установленного Telegram.
- Email-письма — для транзакционных уведомлений: подтверждение регистрации, восстановление доступа.
Такой подход называют каскадной верификацией: вы не зависите от одного канала и можете настроить логику: через какой канал пробовать отправку сначала, а через какой отправлять повторно, если первый способ не сработал.
Что нужно учесть при внедрении
Несколько практических моментов, о которых стоит подумать заранее.
- Внешний вид бота. Пользователь видит имя и аватарку бота в момент подтверждения входа. Если бот выглядит непрофессионально или незнакомо, часть пользователей просто закроет окно. Сделайте бота частью бренда.
- Регистрация всех URL. Telegram не пропускает редиректы на незарегистрированные адреса. Если вы добавите новый домен или поддомен, не забудьте обновить список в BotFather.
- Проверка подписи — обязательна. Данные нельзя принимать без верификации. HMAC-проверка — обязательный шаг.
- Актуальность данных: auth_date показывает, когда пользователь авторизовался. Если прошло больше суток, то стоит попросить повторный вход.
Итог
Авторизация на сайте через Telegram — это работающий инструмент с понятной механикой. Пользователь получает быстрый вход без лишних шагов, вы — верифицированный контакт и возможность общаться с ним напрямую через бота.
Telegram запрашивает авторизацию через своё приложение, которое уже установлено у большинства пользователей. Это снижает барьер входа и ускоряет онбординг.
Технически всё реализуемо своими силами: создаёте бота, регистрируете URL, подключаете виджет или новый клиент, настраиваете проверку подписи. Если нужны дополнительные каналы для кодов подтверждения или сервисных уведомлений — смотрите в сторону Notificore, чтобы объединить Telegram, SMS, email и голос в одном интерфейсе.
Вход через Telegram уже давно перестал быть экзотикой — это практичное решение, которое стоит рассмотреть для любого проекта, где важны конверсия и удобство пользователей.