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.

47 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')
4 weeks ago
window.location.href = process.env.VUE_APP_BASE_API;
return Promise.reject(err)
}
}