优化使用体验

This commit is contained in:
2025-08-11 10:40:56 +08:00
parent 21c01d51d5
commit 360b5a846d
8 changed files with 172 additions and 89 deletions
+47 -20
View File
@@ -1,11 +1,10 @@
import { type LoaderFunctionArgs, redirect } from "@remix-run/node";
import { OAuthClient } from "~/api/login/oauth-client";
import { OAUTH_CONFIG } from "~/config/api-config";
import { createUserSession, saveUserInfo } from "~/api/login/auth.server";
import { JWTUtils, type UserInfoForJWT } from "~/utils/jwt";
export async function loader({ request }: LoaderFunctionArgs) {
const url = new URL(request.url);
const origin = url.origin; // 获取请求的源 (e.g., "http://10.79.97.17:51703")
const code = url.searchParams.get("code");
const state = url.searchParams.get("state");
const error = url.searchParams.get("error");
@@ -42,28 +41,56 @@ export async function loader({ request }: LoaderFunctionArgs) {
try {
console.log("🔧 开始处理OAuth2.0回调");
// 创建OAuth客户端
const oauthClient = new OAuthClient(OAUTH_CONFIG);
console.log("✅ OAuth客户端创建成功");
// --- 修改开始: 不再直接调用OAuthClient,而是通过内部代理API ---
// 获取访问令牌
console.log("🔧 开始获取访问令牌...");
const tokenResponse = await oauthClient.getAccessToken(code);
if (!tokenResponse) {
console.error("❌ 获取访问令牌失败");
return redirect("/login?error=token_error");
}
console.log("✅ 访问令牌获取成功");
// 获取访问令牌 (通过代理)
console.log(`🔧 [Callback] 开始通过内部代理获取访问令牌... (目标: ${origin}/api/oauth/token)`);
const proxyResponse = await fetch(`${origin}/api/oauth/token`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ code }),
});
// 获取用户信息
const userInfo = await oauthClient.getUserInfo(tokenResponse.access_token);
if (!userInfo || !userInfo.success) {
console.error("获取用户信息失败:", userInfo);
return redirect("/login?error=userinfo_error");
const tokenResponse = await proxyResponse.json();
if (!proxyResponse.ok || !tokenResponse.success) {
console.error("❌ [Callback] 通过内部代理获取访问令牌失败:", tokenResponse);
return redirect("/login?error=token_proxy_error");
}
// --- 修改结束 ---
console.log("✅ [Callback] 访问令牌获取成功");
// --- 修改开始: 通过内部代理获取用户信息 ---
console.log(`🔧 [Callback] 开始通过内部代理获取用户信息... (目标: ${origin}/api/oauth/userinfo)`);
const userInfoProxyResponse = await fetch(`${origin}/api/oauth/userinfo`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ accessToken: tokenResponse.access_token }),
});
const userInfoResponse = await userInfoProxyResponse.json();
if (!userInfoProxyResponse.ok || !userInfoResponse.success) {
console.error("❌ [Callback] 通过内部代理获取用户信息失败:", userInfoResponse);
return redirect("/login?error=userinfo_proxy_error");
}
// 将代理返回的用户信息包装成与原有一致的结构
const userInfo = {
success: true,
data: userInfoResponse.data,
};
// --- 修改结束 ---
console.log("✅ [Callback] 用户信息获取成功");
// TODO 根据用户信息判断用户角色,这里可以根据实际业务逻辑调整 暂定都是common
// const userRole = userInfo.data.username === "admin" ? "developer" : "common";
const userRole = "common";
// 获取重定向URL
@@ -91,7 +118,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
ou_id: savedUserData.ou_id,
ou_name: savedUserData.ou_name,
is_leader: savedUserData.is_leader,
user_role: userRole
user_role: userRole as 'common' | 'developer'
};
const frontendJWT = JWTUtils.generateJWT(jwtUserInfo, tokenResponse.expires_in);