如果令牌过期,我将创建一个redux中间件,在任何请求之前刷新令牌。
问题是,在第一个调用之后,我总是得到error 400 bad request,但是如果进行了另一个调用(这是分页请求休息),它可以正常工作,因为令牌被刷新了。
我注意到Axios请求是在新令牌传入之前和设置新的Axios授权头之前触发的,所以我尝试让中间件异步等待,但仍然没有成功.
import {
getJWT,
isTokenExpired
} from "../util/helpers";
import Cookies from "js-cookie";
import axios from "axios";
const refreshTokenMiddleware = store => next => async action => {
if (!action.excludeFromRefresh) {
const token = getJWT();
if (token && isTokenExpired()) {
try {
const { data } = await axios.post("auth/refresh");
axios.defaults.headers.common[
"Authorization"
] = `Bearer ${data.data.access_token}`;
Cookies.set("AppToken", data.data.access_token);
next(action);
} catch (error) {
console.log(error);
}
} else {
next(action);
}
} else {
next(action);
}
};
export default refreshTokenMiddleware;我还怀疑第一次用旧令牌调用Axios请求。
我在这里做错什么了?
=====================
编辑
我试图将中间件全部丢弃,并实现axios拦截器,因为中间件没有捕获axios请求.
axios.interceptors.request.use(
function(config) {
// Do something before request is sent
if (
config.url !== "auth/refresh" &&
config.url !== "auth/login" &&
config.url !== "auth/register"
) {
const token = getJWT();
if (token && isTokenExpired()) {
axios.post("auth/refresh").then(res => {
config.headers.Authorization = `Bearer ${res.data.data.access_token}`;
console.log(
"Inside the refresh in interceptor",
res.data.data.access_token
);
return config;
});
}
}
return config;
},
function(error) {
// Do something with request error
return Promise.reject(error);
}
);但这似乎也不起作用,请求第一次用授权头中的旧令牌触发。
我能做什么?
发布于 2019-10-12 17:14:07
乍一看,这个if语句是错误的,因为您试图同时检查url是否有三个不同的值,我认为您应该在这里使用||操作符。
https://stackoverflow.com/questions/58354086
复制相似问题