"use client"; import { useEffect, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { toast } from "@nice/ui/components/sonner"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@nice/ui/components/card"; import { Button } from "@nice/ui/components/button"; import { authClient } from "@/lib/auth-client"; export default function AuthCallbackPage() { const router = useRouter(); const searchParams = useSearchParams(); const [status, setStatus] = useState<'processing' | 'success' | 'error'>('processing'); const [message, setMessage] = useState('正在处理OAuth认证...'); const [userSession, setUserSession] = useState(null); useEffect(() => { const handleOAuthCallback = async () => { try { // 获取URL参数检查是否有错误 const error = searchParams.get('error'); const errorDescription = searchParams.get('error_description'); const code = searchParams.get('code'); console.log('OAuth回调参数:', { error, errorDescription, code, url: window.location.href }); if (error) { throw new Error(errorDescription || `OAuth错误: ${error}`); } if (!code) { throw new Error('未收到授权码,请重新开始OAuth流程'); } setMessage('收到授权码,正在验证会话...'); // Better Auth会自动处理OAuth回调,我们立即开始检查会话 // 检查会话状态 let attempts = 0; const maxAttempts = 10; while (attempts < maxAttempts) { attempts++; try { const session = await authClient.getSession(); if (session.data?.user) { setStatus('success'); setMessage('OAuth认证成功!'); setUserSession(session.data); toast.success('登录成功!'); // 智能重定向逻辑 let redirectTo = '/'; // 延迟跳转 setTimeout(() => { router.push(redirectTo); }, 1500); return; } } catch (err) { console.log(`会话检查失败 (尝试 ${attempts}):`, err); } // 如果还没有会话,等待一段时间再重试 if (attempts < maxAttempts) { await new Promise(resolve => setTimeout(resolve, 500)); } } throw new Error('OAuth认证超时,未能建立用户会话'); } catch (error) { console.error('OAuth回调处理失败:', error); setStatus('error'); setMessage(error instanceof Error ? error.message : '认证失败'); toast.error(`认证失败: ${error instanceof Error ? error.message : '未知错误'}`); } }; // 延迟执行回调处理,确保页面已加载 const timer = setTimeout(handleOAuthCallback, 100); return () => clearTimeout(timer); }, [searchParams, router]); const handleRetry = () => { // 重新尝试时也使用相同的重定向逻辑 const redirectTo = searchParams.get('state') || '/'; router.push(redirectTo); }; return (
{status === 'processing' && (
)} {status === 'success' && (
)} {status === 'error' && (
)}
{status === 'processing' && 'OAuth认证中'} {status === 'success' && '认证成功'} {status === 'error' && '认证失败'} {message}
{userSession && (

用户信息:

邮箱: {userSession.user.email}
姓名: {userSession.user.name}
用户ID: {userSession.user.id}
)} {status === 'success' && (
正在跳转回原页面...
)} {status === 'error' && ( )}

说明:

  • 此页面处理OAuth2/OIDC认证回调
  • Better Auth自动处理令牌交换
  • 成功后将自动跳转回原页面
); }