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
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:
82
src/app.tsx
82
src/app.tsx
@@ -6,7 +6,7 @@ import type { RunTimeLayoutConfig } from '@umijs/max';
|
|||||||
import { history } from '@umijs/max';
|
import { history } from '@umijs/max';
|
||||||
import defaultSettings from '../config/defaultSettings';
|
import defaultSettings from '../config/defaultSettings';
|
||||||
import { errorConfig } from './requestErrorConfig';
|
import { errorConfig } from './requestErrorConfig';
|
||||||
import { clearSessionToken, getAccessToken, getRefreshToken, getTokenExpireTime } from './access';
|
import { clearSessionToken, getAccessToken,setSessionToken, getRefreshToken, getTokenExpireTime } from './access';
|
||||||
import {
|
import {
|
||||||
getRemoteMenu,
|
getRemoteMenu,
|
||||||
getRoutersInfo,
|
getRoutersInfo,
|
||||||
@@ -64,12 +64,53 @@ export async function getInitialState(): Promise<{
|
|||||||
} as API.CurrentUser;
|
} as API.CurrentUser;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
|
// 如果获取用户信息失败,清除token并跳转到登录页
|
||||||
|
clearSessionToken();
|
||||||
history.push(PageEnum.LOGIN);
|
history.push(PageEnum.LOGIN);
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
};
|
};
|
||||||
// 如果不是登录页面,执行
|
|
||||||
|
// 检查URL参数中是否包含token参数
|
||||||
const { location } = history;
|
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) {
|
if (location.pathname !== PageEnum.LOGIN) {
|
||||||
const currentUser = await fetchUserInfo();
|
const currentUser = await fetchUserInfo();
|
||||||
return {
|
return {
|
||||||
@@ -78,6 +119,7 @@ export async function getInitialState(): Promise<{
|
|||||||
settings: defaultSettings as Partial<LayoutSettings>,
|
settings: defaultSettings as Partial<LayoutSettings>,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fetchUserInfo,
|
fetchUserInfo,
|
||||||
settings: defaultSettings as Partial<LayoutSettings>,
|
settings: defaultSettings as Partial<LayoutSettings>,
|
||||||
@@ -116,6 +158,17 @@ export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) =
|
|||||||
footerRender: () => <Footer />,
|
footerRender: () => <Footer />,
|
||||||
onPageChange: () => {
|
onPageChange: () => {
|
||||||
const { location } = history;
|
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
|
// 如果没有登录,重定向到 login
|
||||||
if (!initialState?.currentUser && location.pathname !== PageEnum.LOGIN) {
|
if (!initialState?.currentUser && location.pathname !== PageEnum.LOGIN) {
|
||||||
history.push(PageEnum.LOGIN);
|
history.push(PageEnum.LOGIN);
|
||||||
@@ -197,14 +250,29 @@ export async function patchClientRoutes({ routes }) {
|
|||||||
|
|
||||||
export async function render(oldRender: () => void) {
|
export async function render(oldRender: () => void) {
|
||||||
console.log('render get routers', oldRender);
|
console.log('render get routers', oldRender);
|
||||||
const token = getAccessToken();
|
|
||||||
if (!token || token?.length === 0) {
|
// 检查URL参数中是否包含token
|
||||||
oldRender();
|
const urlParams = new URL(window.location.href).searchParams;
|
||||||
return;
|
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) => {
|
await getRoutersInfo().then((res) => {
|
||||||
console.log('render get routers', 123);
|
console.log('render get routers', 123);
|
||||||
|
|
||||||
setRemoteMenu(res);
|
setRemoteMenu(res);
|
||||||
oldRender();
|
oldRender();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user