Как усилить защиту в MINI-APP на PuzzleBot
Расскажу, как добавить скрипт прямо в HTML-блок бота на конструкторе PuzzleBot — для чего это, чем поможет и насколько сложно реализовать.
Биометрическая авторизация — это дополнительный уровень защиты вашего Mini App. Даже если кто-то получит доступ к чужому Telegram, он не сможет открыть приложение без Face ID или отпечатка пальца. Это особенно важно, если внутри есть личный кабинет, баланс, персональные данные или платёжные функции.
- Защита от несанкционированного доступа
- Вау-эффект при входе — выглядит современно и технологично
- Работает на iOS (Face ID) и Android (отпечаток пальца)
- Не требует серверов и сложного кода
Сложность: минимальная. Нужно скопировать готовый скрипт и вставить в HTML-блок.
Чтобы реализовать функцию, клонируйте главное Mini App. Это нужно, чтобы создать эффект: пользователь видит размытый фон с элементами главной страницы, проходит биометрию и только потом попадает в основное приложение.
Клон используется только для первого открытия — именно сюда ведёт кнопка входа в боте. Face ID спрашивается один раз, при входе. Дальше пользователь попадает в основное Mini App и при переходах между страницами биометрия больше не запрашивается.
В клонированном Mini App добавьте последним блоком HTML-блок и вставьте скрипт ниже.
<script src="https://cdn.tailwindcss.com"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.1/src/regular/style.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.1/src/fill/style.css"> <link href="https://fonts.googleapis.com/css2?family=Unbounded:wght@200;300;400&display=swap" rel="stylesheet"> <style> * { font-family: 'Unbounded', sans-serif; font-weight: 300; margin: 0; padding: 0; box-sizing: border-box; } #biometric-overlay { position: fixed; inset: 0; z-index: 9999; backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); background: rgba(4, 16, 31, 0.5); display: flex; flex-direction: column; align-items: center; justify-content: flex-end; padding: 0 24px 12vh; text-align: center; color: #fff; transition: opacity 0.5s ease; } #biometric-overlay.hidden { opacity: 0; pointer-events: none; } .icon-block { margin-bottom: 32px; } .text-block { display: flex; flex-direction: column; align-items: center; } .loader { width: 20px; height: 20px; border: 2px solid rgba(129, 169, 255, 0.3); border-top-color: #81a9ff; border-radius: 50%; animation: spin 0.8s linear infinite; margin-top: 20px; } @keyframes spin { to { transform: rotate(360deg); } } </style> <div id="biometric-overlay"> <div id="icon" class="icon-block text-6xl text-[#81a9ff]"> <i class="ph ph-lock"></i> </div> <div class="text-block"> <h1 id="title" class="text-xl font-light mb-2">Проверка личности</h1> <p id="subtitle" class="text-sm text-white/60 font-light">Подтвердите вход</p> <div class="loader" id="loader"></div> </div> </div> <script> Telegram.WebApp.ready(); Telegram.WebApp.expand(); const overlay = document.getElementById('biometric-overlay'); const icon = document.getElementById('icon'); const title = document.getElementById('title'); const subtitle = document.getElementById('subtitle'); const loader = document.getElementById('loader'); const biometrics = '{{biometrics}}'; const platform = Telegram.WebApp.platform; const isDesktop = platform === 'tdesktop' || platform === 'web' || platform === 'weba'; const methodName = platform === 'ios' ? 'Face ID' : 'Отпечаток пальца'; subtitle.innerText = 'Подтвердите вход с помощью ' + methodName; if (biometrics !== 'on' || isDesktop) { gotoWebPage('92b067dfff43e54e'); } else { Telegram.WebApp.BiometricManager.init(() => { const available = Telegram.WebApp.BiometricManager.isBiometricAvailable; if (!available) { gotoWebPage('92b067dfff43e54e'); return; } Telegram.WebApp.BiometricManager.requestAccess( { reason: "Подтвердите личность для входа" }, (granted) => { if (!granted) { showError('Доступ отклонён', 'Вы отклонили запрос'); return; } Telegram.WebApp.BiometricManager.authenticate( { reason: "Вход в приложение" }, (success) => { if (success) { showSuccess(); } else { showError('Ошибка входа', 'Аутентификация не пройдена'); } } ); } ); }); } function showSuccess() { icon.className = 'icon-block text-6xl text-[#4ade80]'; icon.innerHTML = '<i class="ph-fill ph-lock-open"></i>'; title.innerText = 'Доступ разрешён'; subtitle.innerText = 'Перенаправление...'; loader.style.display = 'none'; setTimeout(() => { gotoWebPage('92b067dfff43e54e'); }, 1000); } function showError(t, s) { icon.className = 'icon-block text-6xl text-[#f87171]'; icon.innerHTML = '<i class="ph-fill ph-lock"></i>'; title.innerText = t; subtitle.innerText = s; loader.style.display = 'none'; } </script>
Если вам не удобно скопировать скрипт тут, вы можете найти его на моем канале: https://t.me/ecodetechinfo
В строке: gotoWebPage('92b067dfff43e54e'); вшит ID другого Mini App — того, куда происходит редирект после успешной авторизации. Ниже оставлю скриншот, где его скопировать.
В скрипте используется переменная {{biometrics}}. Создайте текстовую переменную с таким же названием и значением on.
Вы можете самостоятельно реализовать включение и выключение Face ID в настройках Mini App:
- Добавьте форму ввода с кнопками
- Кнопка «Выключить» → меняет значение переменной на
off - Кнопка «Включить» → возвращает
on
Так пользователь сам сможет управлять биометрической защитой.
5. Не забудьте поменять ссылку
После того как вы склонировали Mini App и вставили скрипт, обязательно поменяйте ссылку на главное приложение — то есть на это самое Mini App в вашем боте. Иначе пользователи будут попадать не туда.
- Дополнительный уровень защиты
- Современный вход по биометрии
- Гибкое управление через переменную
- Всё это — без единой строчки серверного кода
Если что-то осталось непонятным — пишите в комментариях, помогу разобраться.
Подпишитесь на наш канал и получайте полезные материалы! https://t.me/ecodetechinfo