From cb4aebccdd220d93bfbbe5e7f033e681da4dd31d Mon Sep 17 00:00:00 2001 From: sunlei Date: Sun, 17 May 2026 15:57:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=E4=BF=AE=E5=A4=8D=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E5=9B=9E=E8=B7=B3=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antdv-next/src/router/guard.ts | 11 +++++++++ apps/web-antdv-next/src/store/auth.ts | 33 ++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/apps/web-antdv-next/src/router/guard.ts b/apps/web-antdv-next/src/router/guard.ts index 2beb371..bba9c4d 100644 --- a/apps/web-antdv-next/src/router/guard.ts +++ b/apps/web-antdv-next/src/router/guard.ts @@ -26,6 +26,10 @@ function redirectToExternalUrl(url: string) { return true; } +function isExternalUrl(url: string) { + return /^https?:\/\//i.test(url); +} + function getRedirectQuery(queryRedirect?: string) { if (queryRedirect) return queryRedirect; @@ -79,6 +83,13 @@ function setupAccessGuard(router: Router) { userStore.userInfo?.homePath || preferences.app.defaultHomePath; + if (isExternalUrl(redirectPath)) { + const hasCookieSession = + await authStore.ensureExternalRedirectSession(); + + if (!hasCookieSession) return true; + } + if (redirectToExternalUrl(redirectPath)) return false; return redirectPath; diff --git a/apps/web-antdv-next/src/store/auth.ts b/apps/web-antdv-next/src/store/auth.ts index 90e2711..8e1190e 100644 --- a/apps/web-antdv-next/src/store/auth.ts +++ b/apps/web-antdv-next/src/store/auth.ts @@ -10,7 +10,13 @@ import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores'; import { notification } from 'antdv-next'; import { defineStore } from 'pinia'; -import { getAccessCodesApi, getUserInfoApi, loginApi, logoutApi } from '#/api'; +import { + getAccessCodesApi, + getUserInfoApi, + loginApi, + logoutApi, + refreshTokenApi, +} from '#/api'; import { $t } from '#/locales'; export const useAuthStore = defineStore('auth', () => { @@ -148,6 +154,30 @@ export const useAuthStore = defineStore('auth', () => { return userInfo; } + async function ensureExternalRedirectSession() { + try { + const resp = (await refreshTokenApi()) as string | { data?: string }; + const accessToken = typeof resp === 'string' ? resp : resp.data; + + if (!accessToken) return false; + + accessStore.setAccessToken(accessToken); + const [fetchUserInfoResult, accessCodes] = await Promise.all([ + fetchUserInfo(), + getAccessCodesApi(), + ]); + + userStore.setUserInfo(fetchUserInfoResult); + accessStore.setAccessCodes(accessCodes); + accessStore.setLoginExpired(false); + return true; + } catch { + resetAllStores(); + accessStore.setLoginExpired(false); + return false; + } + } + function $reset() { loginLoading.value = false; } @@ -155,6 +185,7 @@ export const useAuthStore = defineStore('auth', () => { return { $reset, authLogin, + ensureExternalRedirectSession, fetchUserInfo, loginLoading, logout,