'use client' import { Suspense } from 'react' import { useEffect, useState } from 'react' import { useSearchParams } from 'next/navigation' import { Stack, Text, Loader } from '@mantine/core' function CallbackContent() { const searchParams = useSearchParams() const [error, setError] = useState(null) useEffect(() => { const code = searchParams.get('sso_code') if (!code) { setError('缺少 sso_code 参数') return } // 用 code 调用本应用的 /api/callback 换取用户信息 fetch('/api/callback', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ code }), }) .then(async (res) => { if (!res.ok) { const data = await res.json() throw new Error(data.error || '认证失败') } // 成功 -> 跳转到首页 window.location.href = '/' }) .catch((err) => { setError(err instanceof Error ? err.message : '认证失败') }) }, [searchParams]) if (error) { return ( 认证失败 {error} (window.location.href = '/')}> 返回首页重试 ) } return ( 正在验证 SSO 登录... ) } export default function CallbackPage() { return ( 正在验证 SSO 登录... }> ) }