feat : 新增url中token参数处理登录
Some checks failed
Node CI / build (14.x, macOS-latest) (push) Has been cancelled
Node CI / build (14.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (14.x, windows-latest) (push) Has been cancelled
Node CI / build (16.x, macOS-latest) (push) Has been cancelled
Node CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node CI / build (16.x, windows-latest) (push) Has been cancelled
coverage CI / build (push) Has been cancelled
Node pnpm CI / build (16.x, macOS-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, ubuntu-latest) (push) Has been cancelled
Node pnpm CI / build (16.x, windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled

This commit is contained in:
bin
2025-12-23 15:46:38 +08:00
parent 668f853303
commit 063905292c

View File

@@ -6,7 +6,7 @@ import type { RunTimeLayoutConfig } from '@umijs/max';
import { history } from '@umijs/max';
import defaultSettings from '../config/defaultSettings';
import { errorConfig } from './requestErrorConfig';
import { clearSessionToken, getAccessToken, getRefreshToken, getTokenExpireTime } from './access';
import { clearSessionToken, getAccessToken,setSessionToken, getRefreshToken, getTokenExpireTime } from './access';
import {
getRemoteMenu,
getRoutersInfo,
@@ -64,12 +64,53 @@ export async function getInitialState(): Promise<{
} as API.CurrentUser;
} catch (error) {
console.log(error);
// 如果获取用户信息失败清除token并跳转到登录页
clearSessionToken();
history.push(PageEnum.LOGIN);
}
return undefined;
};
// 如果不是登录页面,执行
// 检查URL参数中是否包含token参数
const { location } = history;
const urlParams = new URL(window.location.href).searchParams;
const tokenFromUrl = urlParams.get('token');
if (tokenFromUrl) {
try {
// 处理token去掉Bearer前缀如果存在
let processedToken = tokenFromUrl.trim();
if (processedToken.startsWith('Bearer ')) {
processedToken = processedToken.substring(7);
}
// 设置token
const current = new Date();
const expireTime = current.setTime(current.getTime() + 1000 * 12 * 60 * 60); // 12小时过期
setSessionToken(processedToken, processedToken, expireTime);
// 尝试获取用户信息
const currentUser = await fetchUserInfo();
if (currentUser) {
// 成功获取用户信息清除URL中的token参数并跳转
const newSearch = new URLSearchParams(urlParams);
newSearch.delete('token');
history.push(urlParams.get('redirect') || '/');
setTimeout(() => history.go(0), 0);
return {
fetchUserInfo,
currentUser,
settings: defaultSettings as Partial<LayoutSettings>,
};
}
} catch (error) {
console.error('处理URL token失败:', error);
clearSessionToken();
}
}
// 如果不是登录页面且没有token参数正常执行
if (location.pathname !== PageEnum.LOGIN) {
const currentUser = await fetchUserInfo();
return {
@@ -78,6 +119,7 @@ export async function getInitialState(): Promise<{
settings: defaultSettings as Partial<LayoutSettings>,
};
}
return {
fetchUserInfo,
settings: defaultSettings as Partial<LayoutSettings>,
@@ -116,6 +158,17 @@ export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) =
footerRender: () => <Footer />,
onPageChange: () => {
const { location } = history;
// 检查URL参数中是否包含token
const urlParams = new URL(window.location.href).searchParams;
const tokenFromUrl = urlParams.get('token');
if (tokenFromUrl) {
// 如果有token参数不执行跳转逻辑由getInitialState处理
return;
}
// 如果没有token参数执行原有的逻辑
// 如果没有登录,重定向到 login
if (!initialState?.currentUser && location.pathname !== PageEnum.LOGIN) {
history.push(PageEnum.LOGIN);
@@ -197,14 +250,29 @@ export async function patchClientRoutes({ routes }) {
export async function render(oldRender: () => void) {
console.log('render get routers', oldRender);
// 检查URL参数中是否包含token
const urlParams = new URL(window.location.href).searchParams;
const tokenFromUrl = urlParams.get('token');
if (tokenFromUrl) {
// 如果URL中有token参数已经在getInitialState中处理过了
const token = getAccessToken();
if (!token || token?.length === 0) {
oldRender();
return;
}
} else {
// 原有逻辑检查本地存储的token
const token = getAccessToken();
if (!token || token?.length === 0) {
oldRender();
return;
}
}
await getRoutersInfo().then((res) => {
console.log('render get routers', 123);
setRemoteMenu(res);
oldRender();
});