【发布时间】:2021-01-29 06:54:19
【问题描述】:
我正在使用此代码拦截 Axios 中的每个 HTTP 调用,以便通过在 JWT 令牌过期时刷新来保持用户登录:
const { token } = window.localStorage;
const axiosInstance = axios.create({
baseURL: process.env.VUE_APP_API_ENDPOINT,
withCredentials: false,
headers: {
Accept: "application/json",
"Content-Type": "application/json",
Authorization: token && token.length > 0 ? `Bearer ${token}` : ""
}
});
axiosInstance.interceptors.request.use(request => {
if (request.url.endsWith("refresh")) { // prevent infinite loop
return request;
}
const { expiryDate } = window.localStorage;
const currentTimestamp = Math.round(new Date().getTime() / 1000);
if (expiryDate && currentTimestamp >= expiryDate) {
console.log("token expired.");
return store
.dispatch("auth/refreshToken") // refreshToken action will place the token in localStorage.token
.then(() => {
const newToken = window.localStorage.token;
request.headers.Authorization = `Bearer ${newToken}`;
return Promise.resolve(request);
})
.catch(() => Promise.resolve(request));
}
console.log("token not expired.");
return request;
});
这在我在页面加载时添加更多请求之前一直工作正常,每个请求都试图刷新导致后端错误的令牌。我该如何解决这个问题?我搜索了很多,但我找到的所有解决方案都是针对interceptors.responselike this one,我想使用interceptors.request,因为登录是可选的,如果用户未登录,则不会有 401 响应。
编辑:根据下面用户 28 的回答,代码已更改为:
axiosInstance.interceptors.request.use(async config => {
if (config.url.endsWith("refresh")) {
// if we are making a refresh token call, return it to prevent infinite loop
return config;
}
await axiosInstance.refreshingToken;
const { expiryDate } = window.localStorage; // token expiry date
const currentTimestamp = Math.round(new Date().getTime() / 1000);
if (expiryDate && currentTimestamp >= expiryDate) {
axiosInstance.refreshingToken = store.dispatch("auth/refreshToken"); // this will update the token in localstorage
await axiosInstance.refreshingToken;
}
const { token } = window.localStorage; // grab the token from localstorage
config.headers.Authorization = `Bearer ${token}`;
return config;
});
【问题讨论】:
标签: javascript vue.js axios vuex