fix some bugs

This commit is contained in:
2026-06-27 13:49:00 +03:30
parent c3b47e33e1
commit 4d004c3515
13 changed files with 331 additions and 57 deletions
+72
View File
@@ -0,0 +1,72 @@
import {
getTokenName,
LEGACY_TOKEN_SUFFIX,
SESSION_AUTH_KEY,
} from '@/themeConfig'
function legacyTokenKeys(): string[] {
const keys: string[] = []
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i)
if (key?.endsWith(LEGACY_TOKEN_SUFFIX)) {
keys.push(key)
}
}
return keys
}
/** خواندن توکن — اول session ثابت، بعد کلید tenant، بعد هر *_app_token */
export function findStoredAuthToken(): string | null {
const session = localStorage.getItem(SESSION_AUTH_KEY)
if (session) {
return session
}
const named = localStorage.getItem(getTokenName())
if (named) {
localStorage.setItem(SESSION_AUTH_KEY, named)
return named
}
for (const key of legacyTokenKeys()) {
const value = localStorage.getItem(key)
if (value) {
localStorage.setItem(SESSION_AUTH_KEY, value)
return value
}
}
return null
}
export function persistAuthToken(token: string | undefined | null) {
if (!token) {
return
}
localStorage.setItem(SESSION_AUTH_KEY, token)
localStorage.setItem(getTokenName(), token)
}
export function clearStoredAuthTokens() {
localStorage.removeItem(SESSION_AUTH_KEY)
for (const key of legacyTokenKeys()) {
localStorage.removeItem(key)
}
}
export function collectAuthTokensForPreserve(): Record<string, string> {
const preserved: Record<string, string> = {}
for (const key of [SESSION_AUTH_KEY, getTokenName(), ...legacyTokenKeys()]) {
const value = localStorage.getItem(key)
if (value) {
preserved[key] = value
}
}
return preserved
}
+12 -5
View File
@@ -1,4 +1,8 @@
import { getTokenName } from '@/themeConfig'
import {
clearStoredAuthTokens,
findStoredAuthToken,
persistAuthToken,
} from '@/utils/authToken'
import { ref } from 'vue'
import {useConfigStore} from "@/store/configStore";
@@ -11,7 +15,10 @@ const nameProject= getConfigApp('name')
function setToken(token: string | undefined) {
return localStorage.setItem(getTokenName(), token)
if (!token) {
return
}
return persistAuthToken(token)
}
function setFingerPrint(val: string | undefined) {
@@ -19,7 +26,7 @@ function setFingerPrint(val: string | undefined) {
}
function getToken() {
return localStorage.getItem(getTokenName())
return findStoredAuthToken()
}
function getIsActiveFingerprint() {
@@ -56,7 +63,7 @@ export async function authenticateWithFingerprint() {
const credentialId = btoa(String.fromCharCode(...new Uint8Array(credential.rawId)))
// بازیابی توکن از localStorage
const token = localStorage.getItem(`${nameProject}_app_token`)
const token = findStoredAuthToken()
if (!token) {
console.warn('توکن پیدا نشد، عملیات متوقف شد.')
@@ -78,7 +85,7 @@ export async function authenticateWithFingerprint() {
function removeToken() {
return localStorage.removeItem(getTokenName())
return clearStoredAuthTokens()
}
function removeFingerPrint() {
+69 -16
View File
@@ -3,6 +3,7 @@ import { baseURL as fallbackBaseURL } from '@/themeConfig'
import type {AxiosRequestConfig, AxiosResponse} from 'axios'
import axios from 'axios'
import {getToken, removeToken} from "@/utils";
import { findStoredAuthToken } from '@/utils/authToken';
import router from "@/router";
import {get} from 'lodash'
import {message} from "ant-design-vue";
@@ -25,6 +26,58 @@ const _axios = axios.create({
headers,
})
let sessionVerifyTimer: ReturnType<typeof setTimeout> | null = null
let sessionVerifyInFlight = false
function requestPath(config: { url?: string; baseURL?: string } | undefined): string {
const raw = String(config?.url ?? '')
if (raw.startsWith('http')) {
try {
return new URL(raw).pathname
} catch {
return raw
}
}
return raw
}
async function logoutToLogin() {
removeToken()
if (router.currentRoute.value.name !== 'login') {
await router.push({ name: 'login' })
}
}
function scheduleSessionVerify() {
if (sessionVerifyTimer) {
return
}
sessionVerifyTimer = setTimeout(async () => {
sessionVerifyTimer = null
if (sessionVerifyInFlight) {
return
}
const token = findStoredAuthToken()
if (!token) {
return
}
sessionVerifyInFlight = true
try {
await _axios.get('/customer/me', {
headers: { Authorization: `Bearer ${token}` },
meta: { errorMessage: 'none' },
})
} catch {
await logoutToLogin()
} finally {
sessionVerifyInFlight = false
}
}, 2000)
}
_axios.interceptors.request.use(
(config) => {
const runtimeBaseURL = getConfigApp('node_server')
@@ -54,24 +107,24 @@ _axios.interceptors.response.use(
return response.data
},
async function (error) {
console.log('this is axios error', error)
if (error.response.data && error.response.data.message) {
checkStatus(error.response.data.message, error.response.status, error.config)
const response = error.response
const config = error.config
if (response?.data?.message && response.status !== 401) {
checkStatus(response.data.message, response.status, config)
}
//console.log('this is error on interceptors.response', error.config.meta)
/* if (error.response && (error.response.status == 401 || error.response.status == 400)) {
//debugger
removeToken()
router.push({ name: 'login' })
}*/
if (error.response && error.response.status == 401) {
///removeToken()
console.log('error')
removeToken()
// router.push({ name: 'login' })
await router.push({name: 'login'})
} else if (error.response && error.response.status == 403) {
if (response?.status === 401) {
const hadAuth = Boolean(config?.headers?.Authorization)
if (hadAuth) {
const path = requestPath(config)
if (path.includes('/customer/me')) {
await logoutToLogin()
} else {
scheduleSessionVerify()
}
}
} else if (response?.status === 403) {
message.error('شما دسترسی لازم برای انجام این عملیات را ندارید')
} else if (error.response && error.response.status == 422) {
// message.error(error.response.data?.message)