Мы используем cookie для улучшения работы сайта. Продолжая использовать наш сайт, вы даете согласие на обработку файлов cookie в соответствии с Политикой конфиденциальности.
Принять
Блог

Авторизация через Telegram для сайта: как подключить и использовать

Если вы когда-нибудь регистрировались на сайте через Google или Apple — вы уже примерно понимаете, о чём речь. Telegram предлагает похожий механизм: пользователь нажимает кнопку, подтверждает вход в приложении и авторизуется. Никаких форм, паролей.
В этой статье посмотрим детальнее, как работает авторизация через Telegram, зачем она вообще нужна и как её подключить на практике.
Стоит сразу отметить, что недавно Telegram анонсировал официальный механизм авторизации. С помощью аккаунта мессенджера можно быстро зарегистрироваться или авторизоваться в приложении или на сайте. Пользователю достаточно поделиться с сайтом или ботом своим номером телефона.

Зачем это нужно и что получаете

Начнём с простого: зачем вообще делать вход через Telegram, если можно сделать обычную форму с логином и паролем.
  • Конверсия растёт. Когда пользователь видит кнопку «Войти через Telegram» — он проходит авторизацию за несколько секунд. Не нужно придумывать пароль, подтверждать email, искать SMS с кодом.
  • Верификация номера телефона — бесплатно. У каждого пользователя Telegram привязан номер телефона. Если нужен верифицированный контакт, этот способ как раз снижает расходы на SMS-подтверждение при регистрации.
  • Прямой канал для общения. После авторизации появляется возможность писать пользователю через бота. Это удобно для уведомлений, подтверждений заказов, сервисных сообщений.
  • Дополнительные возможности. Telegram поддерживает API и мини-приложения.

Как выглядит авторизация на сайте через Telegram

Сначала пройдём этот путь глазами обычного посетителя сайта.
  1. Пользователь открывает ваш сайт и видит кнопку «Войти через Telegram».
  2. Нажимает её — появляется всплывающее окно с предложением ввести номер телефона.
  3. На телефон приходит уведомление от Telegram с просьбой подтвердить вход.
  4. Пользователь нажимает «Принять» в приложении.
  5. Готово — он авторизован на вашем сайте.
Как выглядит авторизация на сайте через 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"
}
Перед тем как доверять этим данным, нужно верифицировать токен на стороне сервера. Алгоритм такой:
  1. Загружаем публичные ключи Telegram с https://oauth.telegram.org/.well-known/jwks.json
  2. Проверяем подпись токена
  3. Убеждаемся, что 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 уже давно перестал быть экзотикой — это практичное решение, которое стоит рассмотреть для любого проекта, где важны конверсия и удобство пользователей.