尝试验证令牌时未定义的标头表达式



我制作了一个express后端,并希望使用JsonWebToken npm库添加一些安全性。

在react应用程序中,我使用了一个拦截器来设置每个请求的auth令牌:

Axios.interceptors.request.use(function (config) {
const token = localStorage.getItem("api_token") || "auth_pending";
config.headers.Authorization =  token;
console.log("Injected header token",token);
return config;
});

在我的节点后端,我使用express库为除登录之外的所有请求设置了一个中间件。

app.use(//((?!login).)*/, (req, res, next)=>{
const {authorization} = req.headers;
// console.log(authorization); next(); #If end function here the token is shown in the console.                     
jwt.verify(authorization, '53CR37C0D3', function(err, decoded) {
if(err){
console.error(err);
return res.status(403).send("Token is not valid.");
}
req.duser = decoded.user;
res.status(200).send("Access granted.");
next();
});

});

如代码所示,如果我只使用中间件来记录令牌,那么它可以正常工作。但是,如果我想使用JWT对其进行解码,则授权将变成未定义。我想这和cors飞行前的要求有关,但我不知道。

首先创建一个中间件文件isAuth.js,然后可以这样实现它:

const jwt = require("jsonwebtoken");
module.exports = (req, res, next) => {
const token = req.get("Authorization"); //get header from req by name 'Autherization'
if (!token || token === "") {
req.isAuth = false;
return next();
}
try {
let decoded = jwt.verify(token, "thisissecret");
req.duser = decoded.user;
res.status(200).send("Access granted.");
} catch (error) {
return res.status(403).send("Token is not valid.");
}
req.isAuth = true;
return next();
};

最后,您可以导入它并将其用作中间件,如下所示:

const isAuth = require('/middleware/isAuth');
...
app.use(isAuth());

最新更新