import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs'; import { cookies } from 'next/headers'; import { NextResponse } from 'next/server'; import type { NextRequest } from 'next/server'; 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)); } try { // 创建supabase客户端 const cookieStore = cookies(); const supabaseRouteHandler = createRouteHandlerClient({ cookies: () => cookieStore }); // 交换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); // 出错时重定向到登录页面 return NextResponse.redirect( new URL('/login?message=Authentication failed. Please try again.', request.url) ); } }