Мини-приложение в Telegram, которое открывает ИИ-курсы без регистрации
BiliMind работает в вебе, в сборках для Android и iOS и внутри Telegram. Этот кейс — о входе через Telegram: мини-приложение для генератора ИИ-курсов BiliMind, которое открывается из чата, незаметно авторизует учащегося и сразу показывает ему экран «Сегодня» с уроками и повторениями на день. Формы регистрации нет. Аккаунт в Telegram и становится аккаунтом в BiliMind.
Это сознательно не чат-бот. Это разработка Telegram Mini App в строгом смысле: идентификация, работа с сессиями и полноценное веб-приложение на Nuxt внутри webview Telegram.
Ключевые возможности
- Бесшовный вход — при запуске подписанные
initDataот Telegram обмениваются на сессию BiliMind, поэтому учащийся вообще не видит формы входа. - Проверка подписи и защита от повторов — проверка HMAC-SHA256 по спецификации Telegram, сравнение хэшей за константное время и окно свежести
auth_date— по умолчанию 24 часа. - Аккаунты без гонок — пользователи находятся или создаются по Telegram ID через
createOrFirst, поэтому два одновременных запуска никогда не создадут дубликат аккаунта. - Единая модель аккаунтов — новый пользователь из Telegram получает персональную «организацию из одного человека» и токен Sanctum, а ответ повторяет формат входа по email, поэтому фронтенд обрабатывает оба пути одинаково.
- Диплинки работают как надо — запуск, который попадает на главную, страницу входа или регистрации, сразу ведёт на «Сегодня», а ссылки на расшаренный курс или конкретный урок открываются там, куда указывают.
- Никакой нагрузки для веб-посетителей — SDK Telegram подгружается только после того, как обнаружен запуск мини-приложения, а не блокирующим скриптом на каждой странице.
Как это работает
Бэкенд на Laravel
POST /api/auth/telegram обязан быть публичным — именно этот эндпоинт выпускает токен, — поэтому он использует тот же ограничитель частоты запросов, что вход и регистрация. TelegramService сортирует поля данных в строку для проверки, выводит секретный ключ из токена бота, сравнивает хэши через hash_equals и считает данные без auth_date устаревшими. Если пользователь уже существует, обновляется сохранённое имя пользователя в Telegram, а недостающая персональная организация восстанавливается. Обход проверки только для разработки позволяет прогонять сценарий локально без настоящего бота и в продакшене выключен. Схема «найти или создать по Telegram ID» — та же, что мы используем в Bronjoy.
Фронтенд на Nuxt
Сигналы запуска от Telegram ненадёжны. Хэш #tgWebAppData исчезает при первой навигации на клиенте, а window.Telegram.WebApp.initData появляется только после выполнения SDK. Мы сохраняем контекст мини-приложения в момент, когда появляется любой из этих сигналов, — в долгоживущую cookie, которая переживает 30-дневную cookie авторизации. Поэтому повторно открытый webview с устаревшим токеном заново авторизуется через initData, а не выкидывается на форму входа. У webview Telegram собственное хранилище cookie, так что этот флаг никогда не попадает в обычный браузер.
Клиентский плагин выполняется раньше глобального guard авторизации, одновременные вызовы делят один выполняющийся запрос на вход, а приложение вызывает ready() и expand(), чтобы занять всю высоту экрана. В обычном браузере или в нативной мобильной оболочке всё это тихо превращается в пустые вызовы.
Наша роль
Мы спроектировали и сделали вход в мини-приложение целиком — эндпоинт и сервис проверки на Laravel, а также логику распознавания запуска и сессий на Nuxt — как часть нашего собственного продукта BiliMind.
Смежные работы
Сам генератор курсов описан в основном кейсе BiliMind. Эта работа входит в наши услуги по разработке Telegram-ботов и разработке веб-приложений, а Telegram-бот для записи Bronjoy показывает бота и мини-приложение, созданные для записи клиентов.



