Telegram-авторизация
Telegram-вход в Mini App работает двумя способами:
- внутри Telegram Mini App backend проверяет Telegram Mini Apps
initData; - при открытии сайта в обычном браузере используется Telegram OAuth / OpenID Connect Authorization Code Flow с PKCE,
nonce, callback/auth/telegram/callbackи серверной проверкойid_tokenпо JWKS Telegram.
initData не требует отдельного OAuth-секрета, но требует корректного BOT_TOKEN, публичного HTTPS Mini App URL и настройки Mini Apps в BotFather. OAuth нужен для входа через кнопку Telegram вне клиента Telegram и для привязки Telegram к email-аккаунту из настроек профиля.
Что нужно заранее
Заголовок раздела «Что нужно заранее»Минимальные переменные:
SUBSCRIPTION_MINI_APP_URL должен быть публичным HTTPS URL именно frontend/Mini App-домена. Не добавляйте сюда /api, /auth, webhook-путь или конкретную страницу.
WEBAPP_SESSION_SECRET должен быть стабильным между рестартами, иначе Web App-сессии и OAuth state-cookie станут невалидными.
WEBAPP_AUTH_MAX_AGE_SECONDS ограничивает возраст Telegram Mini Apps initData и OAuth id_token. По умолчанию это 24 часа. Слишком маленькое значение может ломать вход на устройствах с неточными часами.
WEBAPP_LOGIN_TOKEN_TTL_SECONDS управляет TTL OAuth state, nonce и login-token. По умолчанию 10 минут.
TELEGRAM_OAUTH_CLIENT_ID можно не задавать, если client id совпадает с bot id: приложение возьмет его из префикса BOT_TOKEN. TELEGRAM_OAUTH_CLIENT_SECRET для браузерного OAuth обязателен.
TELEGRAM_OAUTH_REQUEST_ACCESS=write добавляет scope telegram:bot_access, чтобы бот мог написать пользователю после логина. Если это не нужно, оставьте переменную пустой. Также поддерживается phone, если вы осознанно запрашиваете телефон.
Полный справочник переменных: Веб-приложение, внешний вид и Telegram Login.
Настройка в BotFather
Заголовок раздела «Настройка в BotFather»- Откройте
@BotFather->/mybots-> выберите бота. - В
Bot Settings->Domainукажите домен Web App без протокола и пути, напримерapp.domain.com. - В
Bot Settings->Mini Appsукажите URL, напримерhttps://app.domain.com/. - В
Bot Settings->Web Loginвключите OpenID Connect Login, если BotFather предлагает переключение. - Скопируйте client id и client secret в
TELEGRAM_OAUTH_CLIENT_IDиTELEGRAM_OAUTH_CLIENT_SECRET. - В
Web Login->Allowed URLsдобавьте:
После изменения .env перезапустите backend и frontend:
Проксирование
Заголовок раздела «Проксирование»Публичный домен SUBSCRIPTION_MINI_APP_URL должен идти в контейнер frontend:80. Frontend nginx сам проксирует /api/* и /auth/* во внутренний WebApp-сервер backend на backend:8081.
Если используете собственный reverse proxy, не отправляйте /auth/telegram/start и /auth/telegram/callback напрямую в webhook-сервер backend:8080: эти маршруты принадлежат Web App API на backend:8081 и штатно проходят через frontend.
Готовые схемы Caddy, Angie, Nginx, Newt и прямой публикации описаны в развертывании.
Как проверить
Заголовок раздела «Как проверить»Внутри Telegram:
- Откройте Mini App кнопкой бота или через URL, настроенный в BotFather.
- Проверьте, что пользователь входит без OAuth-redirect и видит личный кабинет.
- Если вход не проходит, проверьте
SUBSCRIPTION_MINI_APP_URL, домен BotFather и возрастinitData.
В обычном браузере:
- Откройте
https://app.domain.com/. - Нажмите вход через Telegram.
- Проверьте redirect на Telegram OAuth и возврат на
https://app.domain.com/auth/telegram/callback. - После успешного callback пользователь должен вернуться на
/со статусомtelegram_auth=success, который frontend очистит из URL.
Для диагностики полезны:
Частые ошибки
Заголовок раздела «Частые ошибки»telegram_oauth_not_configuredилиtelegram_auth=not_configured: не заданTELEGRAM_OAUTH_CLIENT_SECRETили client id не удалось получить изTELEGRAM_OAUTH_CLIENT_ID/BOT_TOKEN.Telegram OAuth nonce mismatch: сессия/state устарели, поменялсяWEBAPP_SESSION_SECRET, пользователь открыл старую вкладку или callback пришел с другого домена.Telegram OAuth ID token is stale:WEBAPP_AUTH_MAX_AGE_SECONDSслишком маленький или на сервере/клиенте сбито время.Telegram OAuth callback failed: проверьте allowed URL в BotFather и что/auth/*доходит до frontend/WebApp API.- Mini App не открывается внутри Telegram: домен в BotFather должен совпадать с
SUBSCRIPTION_MINI_APP_URL, а URL должен быть HTTPS.
Общие логи по авторизации собраны в разделе диагностики логов.