mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-09-13 16:23:08 +00:00
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:
@@ -4,7 +4,6 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
||||
import {
|
||||
init,
|
||||
restoreInitData,
|
||||
retrieveRawInitData,
|
||||
mountMiniApp,
|
||||
miniAppReady,
|
||||
mountViewport,
|
||||
@@ -21,6 +20,7 @@ import {
|
||||
} from '@telegram-apps/sdk-react';
|
||||
import { clearStaleSessionIfNeeded } from './utils/token';
|
||||
import { installEncodingSurrogateGuard } from './utils/installEncodingSurrogateGuard';
|
||||
import { getTelegramInitData } from './utils/telegramInitData';
|
||||
import { useAuthStore } from './store/auth';
|
||||
import { AppWithNavigator } from './AppWithNavigator';
|
||||
import { ErrorBoundary } from './components/ErrorBoundary';
|
||||
@@ -38,7 +38,8 @@ installEncodingSurrogateGuard();
|
||||
|
||||
// Polyfill Object.hasOwn for older iOS/Android WebViews (Safari < 15.4, old Chrome).
|
||||
// @telegram-apps/sdk v3 depends on valibot which uses Object.hasOwn internally.
|
||||
// Without this, init() throws LaunchParamsRetrieveError on affected devices.
|
||||
// Without this, init() and any launch-params retrieval below throw
|
||||
// LaunchParamsRetrieveError on affected devices.
|
||||
// See: https://github.com/Telegram-Mini-Apps/tma.js/issues/683
|
||||
if (typeof (Object as { hasOwn?: unknown }).hasOwn !== 'function') {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
@@ -62,7 +63,7 @@ if (isTelegramEnv && !alreadyInitialized) {
|
||||
init();
|
||||
restoreInitData();
|
||||
|
||||
clearStaleSessionIfNeeded(retrieveRawInitData() || null);
|
||||
clearStaleSessionIfNeeded(getTelegramInitData());
|
||||
|
||||
// Adopt the user's Telegram client language on first run (no explicit choice yet).
|
||||
applyTelegramLanguage();
|
||||
|
||||
Reference in New Issue
Block a user