diff --git a/.env b/.env index 4eb00bf7..ace03e36 100644 --- a/.env +++ b/.env @@ -36,7 +36,7 @@ VITE_SERVICE_LOGOUT_CODES=8888,8889 VITE_SERVICE_MODAL_LOGOUT_CODES=7777,7778 # token expired codes of backend service, when the code is received, it will refresh the token and resend the request -VITE_SERVICE_EXPIRED_TOKEN_CODES=9999,9998 +VITE_SERVICE_EXPIRED_TOKEN_CODES=9999,9998,3333 # when the route mode is static, the defined super role VITE_STATIC_SUPER_ROLE=R_SUPER diff --git a/src/service/request/index.ts b/src/service/request/index.ts index 638c3a9b..7d0c6a7f 100644 --- a/src/service/request/index.ts +++ b/src/service/request/index.ts @@ -4,7 +4,7 @@ import { useAuthStore } from '@/store/modules/auth'; import { $t } from '@/locales'; import { localStg } from '@/utils/storage'; import { getServiceBaseURL } from '@/utils/service'; -import { handleRefreshToken, showErrorMsg } from './shared'; +import { getAuthorization, handleExpiredRequest, showErrorMsg } from './shared'; import type { RequestInstanceState } from './type'; const isHttpProxy = import.meta.env.DEV && import.meta.env.VITE_HTTP_PROXY === 'Y'; @@ -19,12 +19,8 @@ export const request = createFlatRequest; + return instance.request(response.config) as Promise; } } diff --git a/src/service/request/shared.ts b/src/service/request/shared.ts index decd63d0..162d4706 100644 --- a/src/service/request/shared.ts +++ b/src/service/request/shared.ts @@ -1,34 +1,44 @@ -import type { AxiosRequestConfig } from 'axios'; import { useAuthStore } from '@/store/modules/auth'; import { localStg } from '@/utils/storage'; import { fetchRefreshToken } from '../api'; import type { RequestInstanceState } from './type'; -/** - * refresh token - * - * @param axiosConfig - request config when the token is expired - */ -export async function handleRefreshToken(axiosConfig: AxiosRequestConfig) { +export function getAuthorization() { + const token = localStg.get('token'); + const Authorization = token ? `Bearer ${token}` : null; + + return Authorization; +} + +/** refresh token */ +async function handleRefreshToken() { const { resetStore } = useAuthStore(); - const refreshToken = localStg.get('refreshToken') || ''; - const { error, data } = await fetchRefreshToken(refreshToken); + const rToken = localStg.get('refreshToken') || ''; + const { error, data } = await fetchRefreshToken(rToken); if (!error) { localStg.set('token', data.token); localStg.set('refreshToken', data.refreshToken); - - const config = { ...axiosConfig }; - if (config.headers) { - config.headers.Authorization = data.token; - } - - return config; + return true; } resetStore(); - return null; + return false; +} + +export async function handleExpiredRequest(state: RequestInstanceState) { + if (!state.refreshTokenFn) { + state.refreshTokenFn = handleRefreshToken(); + } + + const success = await state.refreshTokenFn; + + setTimeout(() => { + state.refreshTokenFn = null; + }, 1000); + + return success; } export function showErrorMsg(state: RequestInstanceState, message: string) { diff --git a/src/service/request/type.ts b/src/service/request/type.ts index b2a5f9c4..4e4a2f71 100644 --- a/src/service/request/type.ts +++ b/src/service/request/type.ts @@ -1,6 +1,6 @@ export interface RequestInstanceState { /** whether the request is refreshing token */ - isRefreshingToken: boolean; + refreshTokenFn: Promise | null; /** the request error message stack */ errMsgStack: string[]; }