From ebb1e77ecc3455b27a795fa8937d13310cfb5fde Mon Sep 17 00:00:00 2001 From: William Tso Date: Wed, 23 Apr 2025 17:50:14 +0800 Subject: [PATCH] Enhance authentication and debugging experience by adding detailed logging for cookie checks, session management, and user redirection. Update middleware to log authentication cookie status and user login state. Refactor login and debug pages to use hard redirects for improved reliability and include session data display. Implement custom cookie handling in Supabase client for better session management. --- .env.local | 2 + app/auth/callback/route.ts | 40 +++++++++++++++++- app/debug/page.tsx | 83 +++++++++++++++++++++++++++++++++++--- app/login/page.tsx | 23 +++++++---- app/page.tsx | 23 +++++++---- lib/auth.tsx | 11 ++++- lib/supabase.ts | 35 ++++++++++++++++ middleware.ts | 21 +++++++--- 8 files changed, 209 insertions(+), 29 deletions(-) create mode 100644 .env.local diff --git a/.env.local b/.env.local new file mode 100644 index 0000000..9915ca0 --- /dev/null +++ b/.env.local @@ -0,0 +1,2 @@ +# Override the port to match what's in .env +PORT=3007 \ No newline at end of file diff --git a/app/auth/callback/route.ts b/app/auth/callback/route.ts index 5ca070e..659bfcd 100644 --- a/app/auth/callback/route.ts +++ b/app/auth/callback/route.ts @@ -7,8 +7,11 @@ export async function GET(request: NextRequest) { const requestUrl = new URL(request.url); const code = requestUrl.searchParams.get('code'); + console.log('Auth callback received:', { url: request.url, hasCode: !!code }); + // 如果没有code参数,则重定向到登录页面 if (!code) { + console.log('没有找到code参数,重定向到登录页面'); return NextResponse.redirect(new URL('/login', request.url)); } @@ -18,9 +21,42 @@ export async function GET(request: NextRequest) { const supabaseRouteHandler = createRouteHandlerClient({ cookies: () => cookieStore }); // 交换code获取会话 - await supabaseRouteHandler.auth.exchangeCodeForSession(code); + console.log('开始交换code获取会话'); + const { data, error } = await supabaseRouteHandler.auth.exchangeCodeForSession(code); - // 直接重定向到首页,避免中间跳转 + if (error) { + console.error('交换会话时出错:', error); + throw error; + } + + console.log('成功获取会话,用户:', data.session?.user.email); + + // 检查会话是否成功创建 + if (data.session) { + console.log('会话创建成功:', { + userId: data.session.user.id, + email: data.session.user.email, + expiresAt: data.session.expires_at ? new Date(data.session.expires_at * 1000).toISOString() : 'unknown' + }); + + // 设置额外的cookie以确保客户端能检测到登录状态 + // 使用Next.js的Response来设置cookie + const response = NextResponse.redirect(new URL('/', request.url)); + response.cookies.set({ + name: 'sb-auth-token', + value: 'true', + path: '/', + maxAge: 60 * 60 * 24 * 7, // 7 days + sameSite: 'lax', + secure: process.env.NODE_ENV === 'production', + httpOnly: false, + }); + console.log('设置了备用cookie: sb-auth-token'); + return response; + } + + // 优先使用应用程序根路径重定向 + console.log('重定向到首页'); return NextResponse.redirect(new URL('/', request.url)); } catch (error) { console.error('Auth callback error:', error); diff --git a/app/debug/page.tsx b/app/debug/page.tsx index cee06ba..819eeca 100644 --- a/app/debug/page.tsx +++ b/app/debug/page.tsx @@ -8,6 +8,8 @@ export default function DebugPage() { const { user, session, isLoading } = useAuth(); const [cookies, setCookies] = useState>({}); const [rawCookies, setRawCookies] = useState(''); + const [sessionData, setSessionData] = useState<{ session: any; user: any } | null>(null); + const [redirectTarget, setRedirectTarget] = useState('/analytics'); useEffect(() => { // 获取所有cookie @@ -22,14 +24,46 @@ export default function DebugPage() { // 测试supabase会话 const testSession = async () => { - const { data, error } = await supabase.auth.getSession(); - console.log('Debug page - Supabase session:', data); - if (error) console.error('Debug page - Session error:', error); + try { + console.log('正在获取Supabase会话'); + const { data, error } = await supabase.auth.getSession(); + console.log('Supabase session result:', { data, error }); + + if (error) { + console.error('Session error:', error); + } else { + setSessionData(data); + } + } catch (err) { + console.error('获取会话出错:', err); + } }; testSession(); }, []); + const refreshSession = async () => { + try { + console.log('手动刷新会话'); + const { data, error } = await supabase.auth.refreshSession(); + console.log('刷新结果:', { data, error }); + alert('会话刷新完成,请查看控制台日志'); + + if (!error && data.session) { + window.location.reload(); + } + } catch (err) { + console.error('刷新会话出错:', err); + alert('刷新会话出错: ' + String(err)); + } + }; + + const forceRedirect = () => { + if (redirectTarget) { + window.location.href = redirectTarget; + } + }; + return (

认证调试页面

@@ -42,9 +76,24 @@ export default function DebugPage() {

用户邮箱: {user?.email || '未登录'}

用户ID: {user?.id || '未登录'}

会话有效: {session ? '是' : '否'}

+

会话过期时间: {session?.expires_at ? new Date(session.expires_at * 1000).toLocaleString() : '无会话'}

+
+

Supabase 会话数据

+
+          {sessionData ? JSON.stringify(sessionData, null, 2) : '加载中...'}
+        
+ + +
+

Cookies 信息

@@ -67,6 +116,25 @@ export default function DebugPage() {
+
+

手动重定向

+
+ setRedirectTarget(e.target.value)} + className="flex-1 px-3 py-2 border border-gray-300 rounded" + placeholder="/analytics" + /> + +
+
+