fix some bugs
This commit is contained in:
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user