fix(auth): читать initData из моста Telegram, а не только из кэша SDK

retrieveRawInitData() ищет параметры запуска по цепочке location.href ->
запись performance о навигации -> кэш tapps/launchParams в sessionStorage,
записывая удачный результат обратно. Последние два источника привязаны к
документу, а не к текущему запуску мини-аппы: как только SPA сменила
маршрут и hash с tgWebAppData ушёл из адреса, остаются данные ПЕРВОГО
запуска в этой сессии WebView. На iOS WebView переживает переоткрытия, и
SDK молча отдаёт старую копию.

Бэкенд принимает initData с auth_date не старше 30 суток, поэтому
застрявшая копия рано или поздно пересекает порог и вход отваливается с
«Invalid or expired Telegram authentication data».

Спрашиваем ещё и window.Telegram.WebApp.initData (официальный мост,
telegram-web-app.js из index.html) и берём вариант со свежим auth_date:
какой источник протух, зависит от платформы, «самый свежий» верен всегда.
Все три места чтения initData сведены в один модуль.
This commit is contained in:
Fringg
2026-08-19 02:00:41 +03:00
parent acbffa4e17
commit f81af401f7
6 changed files with 220 additions and 17 deletions

View File

@@ -13,11 +13,11 @@ import {
enableVerticalSwipes as sdkEnableVerticalSwipes,
expandViewport,
retrieveLaunchParams,
retrieveRawInitData,
themeParamsState,
closeMiniApp as sdkCloseMiniApp,
postEvent,
} from '@telegram-apps/sdk-react';
import { getTelegramInitData as readTelegramInitData } from '../utils/telegramInitData';
const FULLSCREEN_CACHE_KEY = 'cabinet_fullscreen_enabled';
@@ -90,11 +90,7 @@ export function isTelegramMobile(): boolean {
}
export function getTelegramInitData(): string | null {
try {
return retrieveRawInitData() || null;
} catch {
return null;
}
return readTelegramInitData();
}
function isDarkHexColor(hex: string): boolean {