6.9 KiB
6.9 KiB
Telegram WebApp Authentication Guide
📋 Обзор
Система аутентификации использует Telegram WebApp initData для безопасной верификации пользователей.
🔧 Как это работает
- Frontend получает
initDataот Telegram WebApp - Backend валидирует HMAC-SHA256 подпись
- Success: Пользователь аутентифицирован, данные доступны в handlers
- Error: Доступ запрещен (401 Unauthorized)
📝 Требования к переменным окружения
Добавьте в .env файл:
BOT_TOKEN=ваш_токен_бота_от_@BotFather
🛡️ Middleware
Auth Middleware
// Применяется ко всем защищенным маршрутам
app.Use(middleware.AuthMiddleware(middleware.AuthConfig{
BotToken: cfg.BotToken,
}))
Получение данных пользователя в handler
userData := middleware.GetTelegramUser(c)
if userData == nil {
return c.Status(fiber.StatusUnauthorized).JSON(...)
}
// Используем userData.ID, userData.FirstName и т.д.
📡 API Эндпоинты
POST /api/auth/validate
Валидация initData без middleware (для инициализации)
Request:
curl -X POST http://localhost:8080/api/auth/validate \
-H "Content-Type: application/json" \
-d '{
"initData": "query_id=AAHdF6IQAAAAAN0XohDhrOrc&user=%7B%22id%22%3AYOUR_TELEGRAM_USER_ID%2C%22first_name%22%3A%22YOUR_FIRST_NAME%22%2C%22last_name%22%3A%22YOUR_LAST_NAME%22%2C%22username%22%3A%22YOUR_USERNAME%22%2C%22language_code%22%3A%22en%22%2C%22is_premium%22%3Atrue%2C%22allows_write_to_pm%22%3Atrue%7D&auth_date=1634567890&hash=YOUR_HASH_HERE..."
}'
Response (200 OK):
{
"success": true,
"message": "Authentication successful",
"data": {
"id": YOUR_TELEGRAM_USER_ID,
"first_name": "John",
"last_name": "Doe",
"username": "johndoe",
"photo_url": "https://t.me/i/userpic/320/johndoe.jpg",
"auth_date": YOUR_AUTH_DATE,
"hash": "abcd1234..."
}
}
GET /api/auth/me
Получение данных текущего аутентифицированного пользователя
Request:
curl -X GET http://localhost:8080/api/auth/me \
-H "X-Telegram-WebApp-Init-Data: ваш_init_data_здесь"
Response (200 OK):
{
"success": true,
"message": "User data retrieved successfully",
"data": {
"id": YOUR_TELEGRAM_USER_ID,
"first_name": "John",
"last_name": "Doe",
"username": "johndoe",
"photo_url": "https://t.me/i/userpic/320/johndoe.jpg",
"auth_date": YOUR_AUTH_DATE,
"hash": "abcd1234..."
}
}
🔒 Защищенные эндпоинты
Все следующие эндпоинты требуют аутентификации:
User Routes
GET /api/me- профиль пользователяGET /api/user/transactions- история транзакцийGET /api/user/purchases- история покупок
Quiz Routes
GET /api/quizzes- список викторинGET /api/quizzes/:id- детали викториныPOST /api/quizzes/:id/submit- отправка ответовGET /api/quizzes/:id/can-repeat- проверка возможности повтора
Reward Routes
GET /api/rewards- список призовPOST /api/rewards/:id/purchase- покупка приза
QR Routes
POST /api/qr/validate- валидация QR кода
🔄 Как использовать в фронтенде
1. Получение initData из Telegram WebApp
// В вашем Telegram Mini App
const initData = window.Telegram.WebApp.initData;
2. Отправка на бэкенд
// Вариант 1: Через заголовок (рекомендуется)
const response = await fetch('/api/qr/validate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Telegram-WebApp-Init-Data': initData
},
body: JSON.stringify({ payload: 'qr_token_here' })
});
// Вариант 2: Через body для /api/auth/validate
const response = await fetch('/api/auth/validate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ initData })
});
3. Обработка ошибок
if (!response.ok) {
if (response.status === 401) {
// Переадресация на страницу аутентификации
window.location.href = '/auth';
} else {
// Другая ошибка
console.error('Request failed:', response.statusText);
}
}
⚠️ Важные моменты
- Время жизни: initData действителен 5 минут
- Безопасность: Всегда проверяйте HMAC подпись на бэкенде
- Bot Token: Храните в секрете, никогда в клиентском коде
- User ID: Используйте
userData.IDкак уникальный идентификатор
🔧 Тестирование
Генерация тестового initData
Используйте Telegram WebApp Tools для генерации тестовых initData.
Пример curl с реальными данными
# Замените YOUR_INIT_DATA на реальные данные
curl -X POST http://localhost:8080/api/qr/validate \
-H "Content-Type: application/json" \
-H "X-Telegram-WebApp-Init-Data: YOUR_INIT_DATA" \
-d '{"payload": "test_qr_token"}'
🚀 Production Deployment
- HTTPS: Обязательно используйте HTTPS в production
- Bot Token: Используйте переменные окружения
- Rate Limiting: Добавьте rate limiting для auth эндпоинтов
- Logging: Логируйте неудачные попытки аутентификации
- Security: Регулярно обновляйте зависимости
🔍 Отладка
Распространенные ошибки
- 401 Unauthorized: Неверный initData или просрочен
- Hash verification failed: Неверный bot token или поврежденные данные
- Missing Telegram init data: Отсутствует заголовок или initData
- Auth data expired: Данные старше 5 минут
Debug режим
Для отладки можно временно отключить проверку времени:
// В middleware/auth.go закомментируйте проверку времени
// if time.Since(authTime) > 5*time.Minute {
// return errors.New("auth data expired")
// }