Кто открыл мини-приложение
Что это
При открытии Telegram передаёт мини-приложению `initData`: кто его открыл (уникальный id, имя, иногда фамилия и юзернейм, язык, есть ли Premium, разрешил ли он боту писать, ссылка на фото), откуда, метку из ссылки и время. Данные подписаны, и сервер может проверить, что их прислал Telegram. Номера телефона в них нет.
Как сделать
- Приложение отправляет на твой сервер строку `Telegram.WebApp.initData` целиком, с каждым запросом.
- Сервер проверяет её: выстраивает все поля, кроме `hash`, по алфавиту строками… Сервер проверяет её: выстраивает все поля, кроме `hash`, по алфавиту строками `key=value`, подписывает их HMAC-SHA-256 ключом, сделанным из токена бота и слова `WebAppData`, и сравнивает результат с `hash`.
- Сервер смотрит `auth_date`, момент открытия, и отклоняет старые данные.
- Только после этого `user.id` становится ключом человека.
- Нужен телефон или разрешение писать? `requestContact` и `requestWriteAccess` спросят самого человека.
- Партнёр без твоего токена проверяет поле `signature` (Ed25519) открытым ключом Telegram; дай ему `initData` и id бота.
Осторожно
- `initDataUnsafe` — те же данные без проверки: показывать можно, решать по ним нельзя.
- Если приложение открыли кнопкой клавиатуры или из инлайн-режима, `initData` пустая.
- Для проверки нужен токен бота, поэтому она идёт на сервере, а не на странице.
- Срок годности `auth_date` документация не задаёт: выбери свой.
С Gem
Приветствие в мини-приложении каждого проекта спрашивает язык человека и разрешение ему писать, а прогресс сохраняется. Дальше Gem пишет только тем, кто разрешил этому проекту писать, на их языке, и под каждым сообщением есть кнопка, чтобы отписаться.
Источники
- https://core.telegram.org/bots/webapps#validating-data-received-via-the-mini-app
- https://core.telegram.org/bots/webapps#webappinitdata