修改用户授权调用位置和逻辑
This commit is contained in:
105
src/utils/authInit.ts
Normal file
105
src/utils/authInit.ts
Normal 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();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user