Showing
5 changed files
with
31 additions
and
7 deletions
| ... | ... | @@ -248,6 +248,18 @@ export const useUserStore = defineStore({ |
| 248 | 248 | } |
| 249 | 249 | }, |
| 250 | 250 | |
| 251 | + async doShareRefresh() { | |
| 252 | + try { | |
| 253 | + const req = { refreshToken: this.shareRefreshToken } as RefreshTokenParams; | |
| 254 | + const data = await doRefreshToken(req); | |
| 255 | + const { token, refreshToken } = data; | |
| 256 | + this.storeToken(token, refreshToken); | |
| 257 | + } catch (error) { | |
| 258 | + window.location.reload(); | |
| 259 | + throw error; | |
| 260 | + } | |
| 261 | + }, | |
| 262 | + | |
| 251 | 263 | /** |
| 252 | 264 | * @description: Confirm before logging out |
| 253 | 265 | */ | ... | ... |
| ... | ... | @@ -17,6 +17,8 @@ import { |
| 17 | 17 | APP_SESSION_CACHE_KEY, |
| 18 | 18 | MULTIPLE_TABS_KEY, |
| 19 | 19 | MENU_LIST, |
| 20 | + SHARE_JWT_TOKEN_KEY, | |
| 21 | + SHARE_REFRESH_TOKEN_KEY, | |
| 20 | 22 | } from '/@/enums/cacheEnum'; |
| 21 | 23 | import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting'; |
| 22 | 24 | import { toRaw } from 'vue'; |
| ... | ... | @@ -33,6 +35,8 @@ interface BasicStore { |
| 33 | 35 | [PROJ_CFG_KEY]: ProjectConfig; |
| 34 | 36 | [MULTIPLE_TABS_KEY]: RouteLocationNormalized[]; |
| 35 | 37 | [MENU_LIST]: any[]; |
| 38 | + [SHARE_JWT_TOKEN_KEY]: string; | |
| 39 | + [SHARE_REFRESH_TOKEN_KEY]: string; | |
| 36 | 40 | } |
| 37 | 41 | |
| 38 | 42 | type LocalStore = BasicStore; | ... | ... |
| ... | ... | @@ -115,12 +115,19 @@ export class VAxios { |
| 115 | 115 | this.axiosInstance.interceptors.request.use(async (config: AxiosRequestConfig) => { |
| 116 | 116 | // If cancel repeat request is turned on, then cancel repeat request is prohibited |
| 117 | 117 | const userStore = useUserStore(); |
| 118 | - if (userStore && userStore.jwtToken) { | |
| 118 | + if (userStore) { | |
| 119 | 119 | try { |
| 120 | - const res = jwt_decode(userStore.jwtToken) as JwtModel; | |
| 121 | - const currentTime = (new Date().getTime() + (config.timeout || 0)) / 1000; | |
| 122 | - if (currentTime >= res.exp && this.isNeedTokenURL(config.url)) { | |
| 123 | - await this.refreshTokenBeforeReq(userStore.doRefresh); | |
| 120 | + const { requestOptions = {} } = config; | |
| 121 | + const { withShareToken, withToken } = requestOptions; | |
| 122 | + const token = withShareToken && withToken ? userStore.shareJwtToken : userStore.jwtToken; | |
| 123 | + const doRefresh = | |
| 124 | + withShareToken && withToken ? userStore.doShareRefresh : userStore.doRefresh; | |
| 125 | + if (token) { | |
| 126 | + const res = jwt_decode(token) as JwtModel; | |
| 127 | + const currentTime = (new Date().getTime() + (config.timeout || 0)) / 1000; | |
| 128 | + if (currentTime >= res.exp && this.isNeedTokenURL(config.url!)) { | |
| 129 | + await this.refreshTokenBeforeReq(doRefresh); | |
| 130 | + } | |
| 124 | 131 | } |
| 125 | 132 | } catch (error) { |
| 126 | 133 | userStore.logout(); | ... | ... |
| 1 | 1 | /** |
| 2 | 2 | * Data processing class, can be configured according to the project |
| 3 | 3 | */ |
| 4 | -import type { AxiosRequestConfig, AxiosResponse } from 'axios'; | |
| 4 | +import type { AxiosRequestConfig as OriginalAxiosRequestConfig, AxiosResponse } from 'axios'; | |
| 5 | 5 | import type { RequestOptions, Result } from '/#/axios'; |
| 6 | 6 | |
| 7 | 7 | export interface CreateAxiosOptions extends AxiosRequestConfig { |
| ... | ... | @@ -10,6 +10,7 @@ export interface CreateAxiosOptions extends AxiosRequestConfig { |
| 10 | 10 | transform?: AxiosTransform; |
| 11 | 11 | requestOptions?: RequestOptions; |
| 12 | 12 | } |
| 13 | +export type AxiosRequestConfig = OriginalAxiosRequestConfig & { requestOptions?: RequestOptions }; | |
| 13 | 14 | |
| 14 | 15 | export abstract class AxiosTransform { |
| 15 | 16 | /** | ... | ... |