From a2ec6d4648eeee7caefa3d441adfe95383c497ed Mon Sep 17 00:00:00 2001 From: bob <312777916@qq.com> Date: Fri, 13 Sep 2024 22:10:50 +0800 Subject: [PATCH] =?UTF-8?q?http=E8=AF=B7=E6=B1=82=E5=88=B7=E6=96=B0token?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=E9=87=8D=E6=9E=84=EF=BC=88=E5=BE=85=E8=A7=82?= =?UTF-8?q?=E5=AF=9F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + src/stores/user.js | 1 + src/utils/request.js | 69 ++++---------------------------------------- 3 files changed, 7 insertions(+), 64 deletions(-) diff --git a/.gitignore b/.gitignore index 23348ee..3b1629b 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ coverage *.tsbuildinfo note.md +*.bak \ No newline at end of file diff --git a/src/stores/user.js b/src/stores/user.js index 7e47695..289627a 100644 --- a/src/stores/user.js +++ b/src/stores/user.js @@ -17,6 +17,7 @@ export const userStore = defineStore( secret: '', expiretime: 0 }) + // 注意这个是异步的,取到的token一定是有效期内的 const getAccessToken = async () => { const now = new Date().getTime() if (at.value.expiretime && now < at.value.expiretime) { diff --git a/src/utils/request.js b/src/utils/request.js index 07e8b61..fac86b5 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -3,7 +3,6 @@ import { userStore } from '@/stores' import router from '@/router' import CryptoJS from 'crypto-js' import { v4 as uuidv4 } from 'uuid' -import { CLIENT_TYPE, CLIENT_NAME, CLIENT_VERSION } from '@/const/userConst' const baseURL = '/api' //配合vite.config.js中的代理配置解决跨域问题 @@ -23,7 +22,7 @@ const generateSign = (key, content) => { // 请求拦截器 instance.interceptors.request.use( - (config) => { + async (config) => { const userData = userStore() if (config.url === '/user/refreshToken' && userData.rt.token !== '') { const traceId = uuidv4() @@ -34,13 +33,14 @@ instance.interceptors.request.use( config.headers.sign = sigh config.headers.refreshToken = userData.rt.token } else if (userData.at.token !== '') { + const token = await userData.getAccessToken() const traceId = uuidv4() const timestamp = Math.floor(new Date().getTime() / 1000) const sigh = generateSign(userData.at.secret, `${traceId}${timestamp}`) config.headers.traceId = traceId config.headers.timestamp = timestamp config.headers.sign = sigh - config.headers.accessToken = userData.at.token + config.headers.accessToken = token } return config }, @@ -59,9 +59,8 @@ instance.interceptors.response.use( }, async (err) => { if (err.response?.status === 403) { - // 403表示访问禁止,由于AccessToken过期导致,所以凡是403请求均刷新token后重发 - const retryRes = await refreshTokenAndRetry(err.config) - return Promise.resolve(retryRes) + // 403表示访问禁止,由于AccessToken或RefreshToken过期导致 + ElMessage.error('会话过期,请退出后重新登录') } else if (err.response?.status === 401) { // 401错误返回登录页 router.push('/login') @@ -74,63 +73,5 @@ instance.interceptors.response.use( } ) -let isRefreshing = false -let requestsQueue = [] - -const refreshTokenAndRetry = (config) => { - const userData = userStore() - const traceId = uuidv4() - const timestamp = Math.floor(new Date().getTime() / 1000) - const sigh = generateSign(userData.rt.secret, `${traceId}${timestamp}`) - - return new Promise((resolve, reject) => { - if (isRefreshing) { - requestsQueue.push({ resolve, reject, config }) - } else { - isRefreshing = true - axios - .post( - '/api/user/refreshToken', - { - clientType: CLIENT_TYPE, - clientName: CLIENT_NAME, - clientVersion: CLIENT_VERSION - }, - { - headers: { - traceId, - timestamp, - sign: sigh, - refreshToken: userData.rt.token - } - } - ) - .then(async (refreshRes) => { - if (refreshRes.data.code === 0) { - userData.setAt(refreshRes.data.data.accessToken) - const res = await instance(config) - resolve(res) - - while (requestsQueue.length > 0) { - const { resolve, config } = requestsQueue.shift() - const res = await instance(config) - resolve(res) - } - } else { - ElMessage.error(refreshRes.data.desc || '服务异常') - reject(refreshRes.data) - } - }) - .catch((refreshErr) => { - ElMessage.error('服务异常') - reject(refreshErr) - }) - .finally(() => { - isRefreshing = false - }) - } - }) -} - export default instance export { baseURL }