我正在我的网络应用程序中实现令牌身份验证。我的access token
每 N 分钟过期一次,然后 arefresh token
用于登录并获取新的access token
.
我使用 Axios 进行所有 API 调用。我设置了一个拦截器来拦截401
响应。
axios.interceptors.response.use(undefined, function (err) {
if (err.status === 401 && err.config && !err.config.__isRetryRequest) {
serviceRefreshLogin(
getRefreshToken(),
success => { setTokens(success.access_token, success.refresh_token) },
error => { console.log('Refresh login error: ', error) }
)
err.config.__isRetryRequest = true
err.config.headers.Authorization = 'Bearer ' + getAccessToken()
return axios(err.config);
}
throw err
})
基本上,当我截获 401 响应时,我想进行登录,然后使用新令牌重试原始被拒绝的请求。我的函数在其块中serviceRefreshLogin
调用。但问题是该块发生的时间晚于拦截器中的 ,因此重试发生在旧的过期凭据上。setAccessToken()
then
then
getAccessToken()
getAccessToken()
并getRefreshToken()
简单地返回存储在浏览器中的现有令牌(它们管理 localStorage、cookie 等)。
在承诺返回之前,我将如何确保语句不会执行?
(这里是github上对应的issue:https ://github.com/mzabriskie/axios/issues/266 )