You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.2 KiB
46 lines
1.2 KiB
let isRefreshing = false
|
|
let refreshSubscribers = []
|
|
|
|
function onRefreshed(newToken) {
|
|
refreshSubscribers.forEach(cb => cb(newToken))
|
|
refreshSubscribers = []
|
|
}
|
|
|
|
function subscribeTokenRefresh(cb) {
|
|
refreshSubscribers.push(cb)
|
|
}
|
|
|
|
/**
|
|
* 刷新 Token 并重新请求
|
|
* @param {Object} originalRequest - 原始 axios 请求配置
|
|
* @param {AxiosInstance} instance - axios 实例
|
|
*/
|
|
export async function handleTokenRefresh(originalRequest, instance) {
|
|
if (isRefreshing) {
|
|
return new Promise(resolve => {
|
|
subscribeTokenRefresh(token => {
|
|
originalRequest.headers.Authorization = `Bearer ${token}`
|
|
resolve(instance(originalRequest))
|
|
})
|
|
})
|
|
}
|
|
|
|
isRefreshing = true
|
|
try {
|
|
const res = await instance.post('/agentnew/refresh_token')
|
|
const newToken = res.data
|
|
localStorage.setItem('token', newToken)
|
|
|
|
isRefreshing = false
|
|
onRefreshed(newToken)
|
|
|
|
originalRequest.headers.Authorization = `Bearer ${newToken}`
|
|
return instance(originalRequest)
|
|
} catch (err) {
|
|
isRefreshing = false
|
|
refreshSubscribers = []
|
|
localStorage.removeItem('token')
|
|
window.location.href = process.env.VUE_APP_BASE_API;
|
|
return Promise.reject(err)
|
|
}
|
|
}
|
|
|