Задать вопрос
@samanwirst
Вроде бы человек

Как грамотно передать токен доступа к серверу из бота в Mini App?

Пишу сейчас телеграм бота с Mini App (Web App) внутри. Возник вопрос, как передать токен доступа к серверу.

Вкратце, при вводе команды /new_room бот отправляет запрос на сервер и создается "комната" (работает WebSocket). Для создателя комнаты возвращается токен доступа (используя его может управлять комнатой и т.п.). А остальным участникам создатель комнаты просто отправит ссылку с указанием room_id в пути.

Так вот, мне нужно как то передать этот токен из бота в саму аппу. Самый простой вариант это сунуть его в URL, но как по мне если идешь таким путем то не заморачивайся над защитой вообще (небезопасно). Вариант отправить его в чат создателю, а уже после он введет его в поле при открытии мини аппы, но это заставляет пользователя проводить дополнительные действия. Вариант поставить PIN-код входа из 6 цифр, но возвращаемся к той же проблеме с действиями.

Может есть какой-то самый оптимальный путь? Хочется, чтобы пользователь просто открыл и пользовался. Допускаю, что я могу чего-то не знать, каких-то деталей. GPT тоже молчит, не знает что делать, либо предлагает очевидную ересь.
С моей точки зрения сейчас (не зная иных путей), лучшим вариантом если бот перед запуском комнаты отправит одноразовый 6-значный код для входа в сам Mini App. После из аппы отправится запрос на получение многоразового токена в сервер. Но опять же, требуются дополнительные действия от пользователя.
  • Вопрос задан
  • 347 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    SMM-продвижение в Телеграме
    1 месяц
    Далее
  • Skillbox
    Профессия Интернет-маркетолог + ИИ
    12 месяцев
    Далее
  • Бруноям
    SMM-специалист
    4 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 1
@dsignmark
Токен из бота в Mini App передавать вообще не нужно. У Mini App уже есть подписанные данные о том, кто её открыл, и права на комнату проще проверять по ним на сервере.

Как это обычно делается:

1. Когда пользователь открывает Mini App, на фронте есть строка Telegram.WebApp.initData. В ней user.id, auth_date и hash. Подписана она токеном бота, подделать её без токена нельзя.
2. Фронт отправляет initData на ваш сервер, например первым сообщением в WebSocket или в заголовке при подключении.
3. Сервер проверяет подпись по алгоритму из документации (раздел «Validating data received via the Mini App»): HMAC-SHA256 с ключом, выведенным из токена бота. Заодно проверьте auth_date, чтобы старые initData нельзя было переиграть. Например, не старше часа.
4. В момент /new_room бот уже знает message.from_user.id. Сохраните на сервере связку room_id → owner_id. Когда этот же пользователь откроет Mini App, сервер увидит его user.id в проверенной initData и сам выдаст ему права владельца, а остальным — права участника.

Тогда в ссылке остаётся только room_id, и ничего секретного в ней нет. Ссылку можно спокойно пересылать: владельцем станет только тот, чей Telegram-id совпадает.

Если всё же нужна именно ссылка «с правами» (например, создатель хочет назначить второго модератора), положите в startapp-параметр не сам токен, а одноразовый короткоживущий код. Сервер обменивает его на права один раз, после чего код сгорает. Даже если ссылка утечёт позже, по ней уже ничего не сделать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы