From 879603bbad786bffd80194209882d3a02cfd30a8 Mon Sep 17 00:00:00 2001 From: sunlei Date: Sun, 17 May 2026 16:02:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(web):=20=E6=8E=A5=E6=94=B6=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E6=8E=88=E6=9D=83=E5=9B=9E=E8=B7=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/auth.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/api/request.ts | 3 ++- src/main.ts | 3 +++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/api/auth.ts b/src/api/auth.ts index 61d5306..1b39456 100644 --- a/src/api/auth.ts +++ b/src/api/auth.ts @@ -18,6 +18,9 @@ const ACCESS_CODES_KEY = "kt-admin-access-codes"; const USER_INFO_KEY = "kt-admin-user-info"; const LOGIN_REDIRECT_MARK_KEY = "kt-admin-login-redirect-at"; 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 | null = null; let redirectingToAdminLogin = false; @@ -62,6 +65,48 @@ export const persistAuthData = ({ } }; +const parseAuthTransferJson = (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( + url.searchParams.get(AUTH_TRANSFER_CODES_KEY), + ), + accessToken, + userInfo: parseAuthTransferJson( + url.searchParams.get(AUTH_TRANSFER_USER_KEY), + ), + }); + clearAdminLoginRedirectMark(); + removeAuthTransferParams(url); + + return accessToken; +}; + const buildAdminLoginUrl = (redirect: string) => { const loginUrl = new URL(config.adminLogin); diff --git a/src/api/request.ts b/src/api/request.ts index e5e2a39..f370bb4 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -3,6 +3,7 @@ import config from "@/config"; import { clearAdminLoginRedirectMark, clearPersistedAuth, + consumeAdminAuthRedirect, getStoredAccessToken, redirectToAdminLogin, refreshPersistedAuth, @@ -83,7 +84,7 @@ const redirectAfterAuthExpired = () => { }; request.interceptors.request.use(async (requestConfig) => { - const accessToken = getStoredAccessToken(); + const accessToken = consumeAdminAuthRedirect() || getStoredAccessToken(); if (accessToken) { requestConfig.headers.Authorization = `Bearer ${accessToken}`; diff --git a/src/main.ts b/src/main.ts index 5e5578e..84dec6d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,8 +3,11 @@ import { createPinia } from "pinia"; import "virtual:uno.css"; import App from "@/App.vue"; +import { consumeAdminAuthRedirect } from "@/api/auth"; import { router } from "@/router.js"; import "ant-design-vue/dist/reset.css"; +consumeAdminAuthRedirect(); + createApp(App).use(router).use(createPinia()).mount("#app");