Как осуществляется проверка авторизации мини-приложения Telegram на серверной части с использованием PHP?

У меня возник вопрос. Я не совсем понимаю, какие переменные передаются в запросе `get` для формирования подписи и проверки. В официальной документации не нашел примеров на PHP, которые могли бы помочь мне реализовать промежуточное ПО для проверки, что пользователь действительно зашел через Telegram. Можете пояснить?
  • 8 ноября 2024 г. 11:13
Ответы на вопрос 2
Для проверки авторизации пользователей Telegram в мини-приложениях (или ботах) вам нужно следовать процедуре, описанной в официальной документации Telegram. Основная идея заключается в том, что Telegram передает информацию об авторизованном пользователе через GET-запрос, который вы должны проверить на серверной стороне.

Вот основные шаги, которые вам нужно выполнить:

### Шаги для проверки авторизации:

1. **Получение данных**: Когда пользователь нажимает на кнопку 'Авторизоваться', Telegram отправляет данные на ваш сервер через GET-запрос. Данные, которые вы получаете, включают следующие параметры:
   - `id`: уникальный идентификатор пользователя в Telegram.
   - `first_name`: имя пользователя.
   - `last_name`: фамилия пользователя (если есть).
   - `username`: имя пользователя в Telegram (если есть).
   - `photo_url`: URL фотографии пользователя (если есть).
   - `auth_date`: временная метка, когда авторизация была произведена.
   - `hash`: подпись, которая используется для проверки данных.

2. **Формирование строки для подписи**: Для проверки подписи (hash) вам нужно сформировать строку, которая будет содержать все данные, за исключением хеша, и затем создать хеш с помощью HMAC-SHA256 с использованием вашего токена бота как секретного ключа.

3. **Проверка подписи**: Сравните полученный хеш с тем, который вы рассчитали. Если они совпадают, значит, пользователь успешно авторизован.

### Пример кода на PHP:

```php
<?php
// Ваш токен бота
$botToken = 'YOUR_BOT_TOKEN';

// Функция для проверки подписи
function checkAuthorization($data, $botToken) {
    // Извлекаем данные
    $user_id = $data['id'];
    $first_name = $data['first_name'];
    $last_name = $data['last_name'] ?? '';
    $username = $data['username'] ?? '';
    $photo_url = $data['photo_url'] ?? '';
    $auth_date = $data['auth_date'];
    $hash = $data['hash'];

    // Убираем hash из массива
    unset($data['hash']);

    // Сортируем данные по алфавиту и формируем строку
    ksort($data);
    
    // Создаем строку для подписи
    $data_string = http_build_query($data);
    $secret_key = hash('sha256', $botToken, true);
    $check_hash = hash_hmac('sha256', $data_string, $secret_key);

    // Сравниваем подписи и проверяем время
    if ($hash === $check_hash) {
        // Проверяем, что время авторизации в пределах 5 минут
        if (time() - (int)$auth_date < 300) {
            return true; // Успешная авторизация
        }
    }
    
    return false; // Ошибка авторизации
}

// Получаем данные из GET-запроса
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    if (checkAuthorization($_GET, $botToken)) {
        // Пользователь авторизован
        echo "Пользователь авторизован!";
    } else {
        // Ошибка авторизации
        echo "Ошибка авторизации!";
    }
}
?>
```

### Объяснение функций:

- **checkAuthorization**: Эта функция проверяет, прошла ли авторизация успешно. Она принимает данные из GET-запроса и токен бота, формирует строку для подписи и сравнивает ее с присланным хешем. Она также проверяет временную метку, чтобы удостовериться, что она не истекла.

### Заключение:
Следуя этим шагам и используя приведенный выше пример, вы сможете реализовать проверку авторизации пользователей Telegram в своем мини-приложении. Обязательно обратите особое внимание на безопасность и тестируйте свой код.
Похожие вопросы