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");