refactor: 重构用户授权流程,简化 OAuth 和 SSO 重定向逻辑

This commit is contained in:
wood chen 2025-02-21 17:28:14 +08:00
parent 6c8bda6b32
commit f9c912e8c5
2 changed files with 16 additions and 26 deletions

View File

@ -4,27 +4,26 @@ import { redirect } from "next/navigation";
import { signIn as nextSignIn } from "@/auth"; import { signIn as nextSignIn } from "@/auth";
export async function signIn(data: Record<string, any>) { export async function signIn(data: Record<string, any>) {
const { sso, sig, oauth } = data; const { sso, sig, returnTo } = data;
// 先进行 SSO 登录 // 先进行 SSO 登录
await nextSignIn("credentials", { sso, sig }); await nextSignIn("credentials", { sso, sig });
// 如果有 OAuth 参数,重定向到 OAuth 授权页面 // 从 sso 参数中获取 return_sso_url
if (oauth) {
const oauthParams = new URLSearchParams(atob(oauth));
if (oauthParams.has("client_id")) {
const authUrl = `/oauth/authorize?${oauthParams.toString()}`;
redirect(authUrl);
}
}
// 如果没有 OAuth 参数,从 SSO 参数中获取 return_sso_url
const params = new URLSearchParams(atob(sso)); const params = new URLSearchParams(atob(sso));
const returnUrl = params.get("return_sso_url"); const returnSsoUrl = params.get("return_sso_url");
if (!returnUrl) { if (!returnSsoUrl) {
redirect("/dashboard"); // 如果没有 return_sso_url检查是否有 OAuth 参数
} else { const searchParams = new URLSearchParams(returnTo);
redirect(returnUrl); if (searchParams.has("client_id")) {
// 如果是 OAuth 流程,重定向到授权页面
redirect(`/oauth/authorize${returnTo}`);
} }
// 如果都没有,重定向到仪表板
redirect("/dashboard");
}
// 如果有 return_sso_url重定向回 SSO 提供者
redirect(returnSsoUrl);
} }

View File

@ -32,20 +32,11 @@ export function UserAuthorize({
throw new Error("缺少必要的认证参数"); throw new Error("缺少必要的认证参数");
} }
// 获取原始的 OAuth 参数 // 传递 SSO 参数和原始的 search 参数
const originalOAuthParams = new URLSearchParams(window.location.search);
const oauthData: Record<string, string> = {};
Array.from(originalOAuthParams.entries())
.filter(([key]) => key !== "sso" && key !== "sig")
.forEach(([key, value]) => {
oauthData[key] = value;
});
// 传递 SSO 参数和原始的 OAuth 参数
await signIn({ await signIn({
sso, sso,
sig, sig,
oauth: btoa(originalOAuthParams.toString()), returnTo: url.search, // 保存完整的查询参数
}); });
setIsLoading(false); setIsLoading(false);