Розробка авторизації через Telegram Login
Telegram Login — нестандартний OAuth. У Telegram нема OIDC-сумісного провайдера, нема звичайного Authorization Code Flow. Замість цього — власний віджет/протокол з криптографічною верифікацією через HMAC-SHA256. Це вимагає ретельної реалізації на стороні сервера та кількох варіантів на клієнті залежно від завдання.
Два варіанти Telegram Login для мобільних додатків
Telegram Login Widget — JavaScript-віджет для веба, який відкривається у WebView всередину додатку. Користувач натискає «Увійти через Telegram», з'являється popup або QR, користувач підтверджує в Telegram-додатку. Callback приходить у WebView з даними користувача. Найпростіший варіант, мінімум коду.
Telegram Bot + Deep Link — більш нативний підхід для мобільних. Бот генерує одноразову ссилку tg://resolve?domain=YOUR_BOT&start=AUTH_TOKEN. Додаток відкриває цю ссилку — система відкриває Telegram з чатом бота. Користувач натискає Start, бот отримує повідомлення /start AUTH_TOKEN через Webhook, верифікує токен, викликає ваш API. Додаток чекає callback через WebSocket або polling.
Другий варіант складніше архітектурно, але дає повністю нативний UX: Telegram відкривається як звичайний додаток через Universal Link, не WebView.
Криптографічна верифікація даних
Це найважливіша частина Telegram Login. Дані, які Telegram отдає клієнту (id, username, first_name, hash, auth_date), потрібно верифікувати на сервері — інакше зловмисник може підробити авторизацію.
Алгоритм верифікації:
# Python (серверна сторона)
import hashlib
import hmac
def verify_telegram_auth(bot_token: str, auth_data: dict) -> bool:
check_hash = auth_data.pop('hash')
# Рядок для верифікації: відсортовані пари key=value через \n
data_check_string = '\n'.join(
f'{k}={v}' for k, v in sorted(auth_data.items())
)
# Секрет — SHA256 від bot token (не сам токен)
secret_key = hashlib.sha256(bot_token.encode()).digest()
# HMAC-SHA256
calculated_hash = hmac.new(
secret_key,
data_check_string.encode(),
hashlib.sha256
).hexdigest()
# Перевіряємо хеш та свіжість даних (не старіше 24 годин)
return (calculated_hash == check_hash and
time.time() - int(auth_data['auth_date']) < 86400)
bot_token повинен бути тільки на сервері — ніколи в мобільному клієнті. Клієнт передає весь набір даних від Telegram на backend, backend верифікує.
Реалізація WebView варіанту
На мобільному клієнті простіше: завантажуємо HTML-сторінку з Telegram Login Widget у WKWebView (iOS) / WebView (Android). Сторінка повідомляє результат через window.postMessage або URL redirect на custom scheme.
// iOS — обробка redirect з WebView
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let url = navigationAction.request.url,
url.scheme == "myapp",
url.host == "telegram-callback" {
// Парсимо query params — дані від Telegram
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let params = components?.queryItems?.reduce([String:String]()) { ... }
handleTelegramAuth(params)
decisionHandler(.cancel)
return
}
decisionHandler(.allow)
}
Обмеження та edge cases
Telegram Login вимагає привязки до домену: при створенні віджета або налаштуванні бота указуємо домен, з якого дозволена авторизація. Для мобільного додатку без веб-версії це штучне обмеження — потрібно зареєструвати будь-який підконтрольний домен та розмістити на ньому проміжну сторінку.
Користувач без Telegram на пристрої: при відкритті tg:// ссилки — ніщо не відбувається. Потрібен fallback: запропонувати завантажити Telegram або переключитися на інший метод входу.
Аккаунт Telegram не завжди має username (він необов'язковий). first_name — є завжди. Email — Telegram ніколи не передає.
Терміни: від 1 до 2 тижнів. WebView варіант — ближче до тижня. Нативний Deep Link через бота — до двох тижнів з урахуванням серверної частини (Webhook, WebSocket для callback).







