rak*_*los 5 interceptor axios vuex
我在努力使axios拦截器正常工作。
当我的令牌过期时,我需要它刷新访问令牌并在刷新令牌后重试原始请求。我有这部分工作。
问题是,如果我有并发的api调用,它将仅在令牌首次无效时重试第一个请求。
这是我的拦截器代码:
export default function execute() {
let isRefreshing = false
// Request
axios.interceptors.request.use(
config => {
var token = Storage.getAccessToken() //localStorage.getItem("token");
if (token) {
console.log('Bearer ' + token)
config.headers['Authorization'] = 'Bearer ' + token
}
return config
},
error => {
return Promise.reject(error)
}
)
// Response
axios.interceptors.response.use(
response => {
return response
},
error => {
const originalRequest = error.config
// token expired
if (error.response.status === 401) {
console.log('401 Error need to reresh')
originalRequest._retry = true
let tokenModel = {
accessToken: Storage.getAccessToken(),
client: 'Web',
refreshToken: Storage.getRefreshToken()
}
//Storage.destroyTokens();
var refreshPath = Actions.REFRESH
if (!isRefreshing) {
isRefreshing = true
return store
.dispatch(refreshPath, { tokenModel })
.then(response => {
isRefreshing = false
console.log(response)
return axios(originalRequest)
})
.catch(error => {
isRefreshing = false
console.log(error)
// Logout
})
} else {
console.log('XXXXX')
console.log('SOME PROBLEM HERE') // <------------------
console.log('XXXXX')
}
} else {
store.commit(Mutations.SET_ERROR, error.response.data.error)
}
return Promise.reject(error)
}
)
}
Run Code Online (Sandbox Code Playgroud)
我不确定在上面突出显示的else块中需要什么。
编辑:
当我做
return axios(originalRequest)
Run Code Online (Sandbox Code Playgroud)
在else块中,它起作用,但是我对行为不满意。它基本上一次又一次地重试所有请求,直到刷新令牌。我希望令牌刷新后重试一次。任何想法
谢谢
我不知道您的令牌的架构是什么(解密后),但最好保留的属性之一是 exp“expiration_date”。这么说,有了过期日期,您就可以知道何时应该刷新令牌。
如果不了解您的架构,就很难提供正确的解决方案。但是假设您正在手动执行所有操作,通常 onIdle/onActive 是我们检查用户会话是否仍然正常的时候,所以此时您可以使用令牌信息来知道是否应该刷新其值。
理解这个过程很重要,因为只有当用户持续活跃且即将过期(比如 2 分钟前)时,令牌才应该刷新。
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |