fix(web): 接收后台授权回跳

This commit is contained in:
sunlei 2026-05-17 16:02:36 +08:00
parent ed37ca5d12
commit 879603bbad
3 changed files with 50 additions and 1 deletions

View File

@ -18,6 +18,9 @@ const ACCESS_CODES_KEY = "kt-admin-access-codes";
const USER_INFO_KEY = "kt-admin-user-info"; const USER_INFO_KEY = "kt-admin-user-info";
const LOGIN_REDIRECT_MARK_KEY = "kt-admin-login-redirect-at"; const LOGIN_REDIRECT_MARK_KEY = "kt-admin-login-redirect-at";
const LOGIN_REDIRECT_COOLDOWN = 10 * 1000; const LOGIN_REDIRECT_COOLDOWN = 10 * 1000;
const AUTH_TRANSFER_TOKEN_KEY = "ktAccessToken";
const AUTH_TRANSFER_CODES_KEY = "ktAccessCodes";
const AUTH_TRANSFER_USER_KEY = "ktUserInfo";
let refreshPromise: Promise<string | null> | null = null; let refreshPromise: Promise<string | null> | null = null;
let redirectingToAdminLogin = false; let redirectingToAdminLogin = false;
@ -62,6 +65,48 @@ export const persistAuthData = ({
} }
}; };
const parseAuthTransferJson = <T>(value: string | null) => {
if (!value) return undefined;
try {
return JSON.parse(value) as T;
} catch {
return undefined;
}
};
const removeAuthTransferParams = (url: URL) => {
url.searchParams.delete(AUTH_TRANSFER_TOKEN_KEY);
url.searchParams.delete(AUTH_TRANSFER_CODES_KEY);
url.searchParams.delete(AUTH_TRANSFER_USER_KEY);
window.history.replaceState(
window.history.state,
document.title,
`${url.pathname}${url.search}${url.hash}`,
);
};
export const consumeAdminAuthRedirect = () => {
const url = new URL(window.location.href);
const accessToken = url.searchParams.get(AUTH_TRANSFER_TOKEN_KEY);
if (!accessToken) return null;
persistAuthData({
accessCodes: parseAuthTransferJson<string[]>(
url.searchParams.get(AUTH_TRANSFER_CODES_KEY),
),
accessToken,
userInfo: parseAuthTransferJson<unknown>(
url.searchParams.get(AUTH_TRANSFER_USER_KEY),
),
});
clearAdminLoginRedirectMark();
removeAuthTransferParams(url);
return accessToken;
};
const buildAdminLoginUrl = (redirect: string) => { const buildAdminLoginUrl = (redirect: string) => {
const loginUrl = new URL(config.adminLogin); const loginUrl = new URL(config.adminLogin);

View File

@ -3,6 +3,7 @@ import config from "@/config";
import { import {
clearAdminLoginRedirectMark, clearAdminLoginRedirectMark,
clearPersistedAuth, clearPersistedAuth,
consumeAdminAuthRedirect,
getStoredAccessToken, getStoredAccessToken,
redirectToAdminLogin, redirectToAdminLogin,
refreshPersistedAuth, refreshPersistedAuth,
@ -83,7 +84,7 @@ const redirectAfterAuthExpired = () => {
}; };
request.interceptors.request.use(async (requestConfig) => { request.interceptors.request.use(async (requestConfig) => {
const accessToken = getStoredAccessToken(); const accessToken = consumeAdminAuthRedirect() || getStoredAccessToken();
if (accessToken) { if (accessToken) {
requestConfig.headers.Authorization = `Bearer ${accessToken}`; requestConfig.headers.Authorization = `Bearer ${accessToken}`;

View File

@ -3,8 +3,11 @@ import { createPinia } from "pinia";
import "virtual:uno.css"; import "virtual:uno.css";
import App from "@/App.vue"; import App from "@/App.vue";
import { consumeAdminAuthRedirect } from "@/api/auth";
import { router } from "@/router.js"; import { router } from "@/router.js";
import "ant-design-vue/dist/reset.css"; import "ant-design-vue/dist/reset.css";
consumeAdminAuthRedirect();
createApp(App).use(router).use(createPinia()).mount("#app"); createApp(App).use(router).use(createPinia()).mount("#app");