修改用户授权调用位置和逻辑

This commit is contained in:
张成
2025-11-18 08:00:38 +08:00
parent 4568e758a7
commit 988f57aa5e
12 changed files with 343 additions and 81 deletions

105
src/utils/authInit.ts Normal file
View File

@@ -0,0 +1,105 @@
import { check_login_status, get_user_token, silentLogin } from "@/services/loginService";
import { useUser } from "@/store/userStore";
import tokenManager from "@/utils/tokenManager";
// 防止重复调用静默登录
let isInitializingAuth = false;
let authInitPromise: Promise<void> | null = null;
// 初始化用户授权的核心逻辑
const initUserAuthCore = async (): Promise<void> => {
// 如果正在初始化,直接返回现有的 Promise
if (isInitializingAuth && authInitPromise) {
return authInitPromise;
}
// 如果已经登录且有用户信息,跳过
const login_status = check_login_status();
const { user, fetchUserInfo } = useUser.getState();
if (login_status && user && Object.keys(user).length > 0) {
return Promise.resolve();
}
isInitializingAuth = true;
authInitPromise = (async () => {
try {
if (login_status) {
// 已登录,获取用户信息
try {
await fetchUserInfo();
} catch (error) {
console.error('获取用户信息失败:', error);
}
} else {
// 未登录,尝试静默登录
try {
const loginResult = await silentLogin();
if (loginResult.success) {
// 静默登录成功,获取用户信息
await fetchUserInfo();
}
} catch (error) {
console.error('静默登录失败:', error);
// 静默登录失败不影响使用
}
}
} catch (error) {
console.error('初始化用户授权失败:', error);
} finally {
isInitializingAuth = false;
authInitPromise = null;
}
})();
return authInitPromise;
};
// 导出等待静默登录完成的函数,供页面组件使用
export const waitForAuthInit = async (): Promise<void> => {
// 检查是否已经有有效的 token最优先检查
if (tokenManager.hasValidToken() || get_user_token()) {
return Promise.resolve();
}
// 如果正在初始化,等待完成
if (authInitPromise) {
await authInitPromise;
// 等待完成后再次检查 token
if (tokenManager.hasValidToken() || get_user_token()) {
return;
}
}
// 检查是否已经登录且有用户信息
const login_status = check_login_status();
const { user } = useUser.getState();
if (login_status && user && Object.keys(user).length > 0) {
// 即使有登录状态,也确保 token 存在
if (tokenManager.hasValidToken() || get_user_token()) {
return Promise.resolve();
}
}
// 触发初始化
const promise = initUserAuthCore();
await promise;
// 等待 token 真正存在(最多等待 2 秒)
let retryCount = 0;
const maxRetries = 20; // 20 * 100ms = 2秒
while (retryCount < maxRetries && !tokenManager.hasValidToken() && !get_user_token()) {
await new Promise(resolve => setTimeout(resolve, 100));
retryCount++;
}
// 如果还是没有 token记录警告但继续执行
if (!tokenManager.hasValidToken() && !get_user_token()) {
console.warn('等待静默登录完成,但未获取到 token');
}
};
// 导出初始化函数供 app.ts 使用
export const initUserAuth = () => {
return initUserAuthCore();
};