From 8092c7fecce8651da89fd00f28674360e732e8d7 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Thu, 18 Sep 2025 12:51:20 +0300 Subject: [PATCH] hotfix(auth): missing session --- apps/web/actions/session.ts | 5 +- apps/web/app/(auth)/page.tsx | 2 + apps/web/app/(auth)/telegram/page.tsx | 75 +++++++++++++++++++-------- apps/web/middleware.ts | 2 +- 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/apps/web/actions/session.ts b/apps/web/actions/session.ts index e3f57b7..f6c249c 100644 --- a/apps/web/actions/session.ts +++ b/apps/web/actions/session.ts @@ -2,12 +2,15 @@ import { authOptions } from '@/config/auth'; import { getServerSession } from 'next-auth/next'; +import { redirect } from 'next/navigation'; export async function getSessionUser() { const session = await getServerSession(authOptions); const user = session?.user; - if (!user?.telegramId) throw new Error('Missing session'); + if (!user?.telegramId) { + return redirect('/'); + } return user; } diff --git a/apps/web/app/(auth)/page.tsx b/apps/web/app/(auth)/page.tsx index 2276c75..639fe74 100644 --- a/apps/web/app/(auth)/page.tsx +++ b/apps/web/app/(auth)/page.tsx @@ -10,4 +10,6 @@ export default function Page() { redirect(isTG ? '/telegram' : '/browser'); }); + + return 'Redirecting...'; } diff --git a/apps/web/app/(auth)/telegram/page.tsx b/apps/web/app/(auth)/telegram/page.tsx index e3a09dc..3165077 100644 --- a/apps/web/app/(auth)/telegram/page.tsx +++ b/apps/web/app/(auth)/telegram/page.tsx @@ -1,50 +1,79 @@ /* eslint-disable promise/prefer-await-to-then */ 'use client'; +import { LoadingSpinner } from '@repo/ui/components/ui/spinner'; import { initData, isMiniAppDark, useSignal } from '@telegram-apps/sdk-react'; -import { signIn, useSession } from 'next-auth/react'; +import { signIn, type SignInResponse, useSession } from 'next-auth/react'; import { useTheme } from 'next-themes'; -import { redirect } from 'next/navigation'; -import { useEffect } from 'react'; +import { useRouter } from 'next/navigation'; +import { useCallback, useEffect } from 'react'; export default function Auth() { useTelegramTheme(); - useAuth(); - return null; + useTelegramAuth(); + + return ; } -function useAuth() { +/** + * Хук для авторизации пользователя через NextAuth + */ +function useTelegramAuth() { const initDataUser = useSignal(initData.user); - const { status } = useSession(); + + const { data: session, status } = useSession(); + const router = useRouter(); + + const handleSignInResult = useCallback( + (result: SignInResponse | undefined) => { + if (!result) return; + + if ( + result.error && + (result.error.includes('CredentialsSignin') || result.error.includes('UNREGISTERED')) + ) { + router.replace('/unregistered'); + } else if (result.ok) { + router.replace('/profile'); + } + }, + [router], + ); useEffect(() => { - if (!initDataUser?.id) return; + const telegramId = initDataUser?.id; + if (!telegramId) return; if (status === 'authenticated') { - redirect('/profile'); + // Если telegramId есть в сессии — редирект + if (session?.user?.telegramId) { + router.replace('/profile'); + } else { + // Если telegramId отсутствует — пробуем заново signIn + void signIn('telegram', { + callbackUrl: '/profile', + redirect: false, + telegramId: telegramId.toString(), + }).then(handleSignInResult); + } + + return; } if (status === 'unauthenticated') { - signIn('telegram', { + void signIn('telegram', { callbackUrl: '/profile', redirect: false, - telegramId: initDataUser.id.toString(), - }).then((result) => { - if ( - result?.error && - (result?.error?.includes('CredentialsSignin') || result?.error?.includes('UNREGISTERED')) - ) { - // Пользователь не зарегистрирован - redirect('/unregistered'); - } else if (result?.ok) { - redirect('/profile'); - } - }); + telegramId: telegramId.toString(), + }).then(handleSignInResult); } - }, [initDataUser?.id, status]); + }, [initDataUser?.id, status, session?.user?.telegramId, router, handleSignInResult]); } +/** + * Хук для установки темы из Telegram Mini App + */ function useTelegramTheme() { const isDark = isMiniAppDark(); const { setTheme } = useTheme(); diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index 50f7d58..a7f5f1d 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -3,7 +3,7 @@ import { withAuth } from 'next-auth/middleware'; export default withAuth({ callbacks: { - authorized: ({ token }) => Boolean(token), + authorized: ({ token }) => Boolean(token?.telegramId), }, pages: { signIn: '/',