"use client" import { useRouter, useSearchParams } from "next/navigation" import { Suspense, useEffect, useRef } from "react" import { toast } from "sonner" import { exchangeOIDCTicket } from "@/lib/api/auth" export default function OIDCLoginCallbackPage() { return ( }> ) } function OIDCLoginCallbackContent() { const router = useRouter() const searchParams = useSearchParams() const ranRef = useRef(false) useEffect(() => { if (ranRef.current) { return } ranRef.current = true const ticket = searchParams.get("ticket")?.trim() ?? "" const next = searchParams.get("next") const nextPath = next && next.startsWith("/") ? next : "/dashboard" if (!ticket) { toast.error("OIDC 登录票据不存在") router.replace("/dashboard/login") return } void exchangeOIDCTicket(ticket) .then(() => { toast.success("登录成功,正在进入系统") router.replace(nextPath) }) .catch((error) => { toast.error(error instanceof Error ? error.message : "OIDC 登录失败") router.replace("/dashboard/login") }) }, [router, searchParams]) return } function OIDCLoginCallbackFallback() { return (

OIDC 登录中

正在校验登录票据并进入系统,请稍候。

) }