'use client'; import { useEffect, useState } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { oidcClient } from '@/lib/auth/oidc-client'; import { TokenManager } from '@/lib/auth/token-manager'; import { useAuth } from '@/components/providers/auth-provider'; import { useToken } from '@/components/providers/token-provider'; export default function AuthCallbackPage() { const router = useRouter(); const searchParams = useSearchParams(); const { loadUser } = useAuth(); const { forceRefresh } = useToken(); const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); const [message, setMessage] = useState('正在处理授权回调...'); useEffect(() => { const handleCallback = async () => { try { // 获取 URL 参数 const code = searchParams.get('code'); const state = searchParams.get('state'); const error = searchParams.get('error'); // 检查是否有错误 if (error) { throw new Error(searchParams.get('error_description') || error); } // 检查必需参数 if (!code || !state) { throw new Error('授权回调参数不完整'); } // 验证状态值(防CSRF) const savedState = sessionStorage.getItem('oauth_state'); const savedRedirectUri = sessionStorage.getItem('oauth_redirect_uri'); if (state !== savedState) { throw new Error('状态验证失败,可能存在安全风险'); } if (!savedRedirectUri) { throw new Error('未找到保存的回调地址'); } setMessage('正在交换授权码...'); // 使用授权码获取令牌 const tokenResponse = await oidcClient.handleAuthorizationCallback( code, savedRedirectUri, state ); setMessage('正在保存令牌...'); // 保存令牌 TokenManager.saveTokens(tokenResponse); setMessage('正在更新认证状态...'); // 同步令牌状态和认证状态 await forceRefresh(); await loadUser(); setMessage('登录成功,正在跳转...'); setStatus('success'); // 清理存储的状态 sessionStorage.removeItem('oauth_state'); sessionStorage.removeItem('oauth_redirect_uri'); // 延迟跳转,让用户看到成功信息 setTimeout(() => { // 获取保存的返回URL,如果没有则跳转到dashboard const savedReturnUrl = sessionStorage.getItem('oauth_return_url') || '/dashboard'; sessionStorage.removeItem('oauth_return_url'); // 清理 router.push(savedReturnUrl); }, 1500); } catch (error) { console.error('授权回调失败:', error); setStatus('error'); setMessage(error instanceof Error ? error.message : '授权失败'); // 清理存储的状态 sessionStorage.removeItem('oauth_state'); sessionStorage.removeItem('oauth_redirect_uri'); } }; handleCallback(); }, [searchParams, router, loadUser, forceRefresh]); return (
{status === 'loading' && (
)} {status === 'success' && (
)} {status === 'error' && (
)}

{status === 'loading' && '处理中'} {status === 'success' && '登录成功'} {status === 'error' && '登录失败'}

{message}

{status === 'error' && ( )}
); }