fix(auth): revoke captured client sessions safely on logout

This commit is contained in:
2026-10-05 17:13:46 +08:00
parent e139c5c87b
commit 3703d0a677
8 changed files with 175 additions and 28 deletions
+13 -2
View File
@@ -61,6 +61,7 @@ export const useAuthStore = defineStore('client-auth', () => {
const permissionCodes = ref<string[]>([])
const sessionRestored = ref(false)
let logoutRequest: { accessToken: string; refreshToken: string; promise: Promise<void> } | undefined
let generation = 0
let contextRequest: { generation: number; promise: Promise<void> } | undefined
let restoreTimer: ReturnType<typeof setTimeout> | undefined
@@ -199,10 +200,20 @@ export const useAuthStore = defineStore('client-auth', () => {
await restoreSession()
}
async function logout() {
function logout() {
const accessToken = getAccessToken()
const refreshToken = getRefreshToken()
if (logoutRequest && ((!accessToken && !refreshToken)
|| (logoutRequest.accessToken === accessToken && logoutRequest.refreshToken === refreshToken))) return logoutRequest.promise
const pending = accessToken || refreshToken
? logoutMerchant(accessToken, refreshToken)
: Promise.resolve()
clearSession()
if (refreshToken) await logoutMerchant(refreshToken)
const request = { accessToken, refreshToken, promise: pending.finally(() => {
if (logoutRequest === request) logoutRequest = undefined
}) }
logoutRequest = request
return request.promise
}
function hasPermission(permission?: string) {