68 lines
2.4 KiB
TypeScript
68 lines
2.4 KiB
TypeScript
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)
|
||
);
|
||
}
|
||
}
|