51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
import { type LoaderFunctionArgs, redirect } from "@remix-run/node";
|
|
import { OAuthClient } from "~/api/login/oauth-client";
|
|
import { OAUTH_CONFIG } from "~/config/api-config";
|
|
import { sessionStorage } from "~/api/login/auth.server";
|
|
|
|
export async function loader({ request }: LoaderFunctionArgs) {
|
|
const session = await sessionStorage.getSession(request.headers.get("Cookie"));
|
|
|
|
// 获取访问令牌
|
|
const accessToken = session.get("accessToken");
|
|
|
|
if (accessToken) {
|
|
try {
|
|
// 创建OAuth客户端
|
|
const oauthClient = new OAuthClient(OAUTH_CONFIG);
|
|
|
|
// 构建登出后重定向URL
|
|
const url = new URL(request.url);
|
|
const redirectUrl = url.searchParams.get("redirect") || `${url.protocol}//${url.host}/login`;
|
|
|
|
// 调用IDaaS单点登出
|
|
const logoutSuccess = await oauthClient.logout(accessToken, redirectUrl);
|
|
|
|
if (!logoutSuccess) {
|
|
console.warn("IDaaS单点登出失败,但仍清除本地会话");
|
|
}
|
|
} catch (error) {
|
|
console.error("单点登出过程中出错:", error);
|
|
}
|
|
}
|
|
|
|
// 无论IDaaS登出是否成功,都清除本地会话
|
|
const cookie = await sessionStorage.destroySession(session);
|
|
|
|
return redirect("/login", {
|
|
headers: {
|
|
"Set-Cookie": cookie
|
|
}
|
|
});
|
|
}
|
|
|
|
export default function Logout() {
|
|
return (
|
|
<div className="flex items-center justify-center min-h-screen">
|
|
<div className="text-center">
|
|
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500 mx-auto"></div>
|
|
<p className="mt-4 text-gray-600">正在退出登录...</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
} |