# Telegram WebApp Authentication Guide

## 📋 Обзор

Система аутентификации использует Telegram WebApp initData для безопасной верификации пользователей.

## 🔧 Как это работает

1. **Frontend** получает `initData` от Telegram WebApp
2. **Backend** валидирует HMAC-SHA256 подпись
3. **Success**: Пользователь аутентифицирован, данные доступны в handlers
4. **Error**: Доступ запрещен (401 Unauthorized)

## 📝 Требования к переменным окружения

Добавьте в `.env` файл:

```env
BOT_TOKEN=ваш_токен_бота_от_@BotFather
```

## 🛡️ Middleware

### Auth Middleware
```go
// Применяется ко всем защищенным маршрутам
app.Use(middleware.AuthMiddleware(middleware.AuthConfig{
    BotToken: cfg.BotToken,
}))
```

### Получение данных пользователя в handler
```go
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:**
```bash
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):**
```json
{
  "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:**
```bash
curl -X GET http://localhost:8080/api/auth/me \
  -H "X-Telegram-WebApp-Init-Data: ваш_init_data_здесь"
```

**Response (200 OK):**
```json
{
  "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
```javascript
// В вашем Telegram Mini App
const initData = window.Telegram.WebApp.initData;
```

### 2. Отправка на бэкенд
```javascript
// Вариант 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. Обработка ошибок
```javascript
if (!response.ok) {
  if (response.status === 401) {
    // Переадресация на страницу аутентификации
    window.location.href = '/auth';
  } else {
    // Другая ошибка
    console.error('Request failed:', response.statusText);
  }
}
```

## ⚠️ Важные моменты

1. **Время жизни**: initData действителен 5 минут
2. **Безопасность**: Всегда проверяйте HMAC подпись на бэкенде
3. **Bot Token**: Храните в секрете, никогда в клиентском коде
4. **User ID**: Используйте `userData.ID` как уникальный идентификатор

## 🔧 Тестирование

### Генерация тестового initData
Используйте [Telegram WebApp Tools](https://telegram-web-app-tools.vercel.app/) для генерации тестовых initData.

### Пример curl с реальными данными
```bash
# Замените 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

1. **HTTPS**: Обязательно используйте HTTPS в production
2. **Bot Token**: Используйте переменные окружения
3. **Rate Limiting**: Добавьте rate limiting для auth эндпоинтов
4. **Logging**: Логируйте неудачные попытки аутентификации
5. **Security**: Регулярно обновляйте зависимости

## 🔍 Отладка

### Распространенные ошибки

1. **401 Unauthorized**: Неверный initData или просрочен
2. **Hash verification failed**: Неверный bot token или поврежденные данные
3. **Missing Telegram init data**: Отсутствует заголовок или initData
4. **Auth data expired**: Данные старше 5 минут

### Debug режим
Для отладки можно временно отключить проверку времени:
```go
// В middleware/auth.go закомментируйте проверку времени
// if time.Since(authTime) > 5*time.Minute {
//     return errors.New("auth data expired")
// }
```