带有JWT身份验证的Node.js API
我有一个Node.js Express API,它没有任何安全性,现在我想修补基于JWT的授权 我有一个方法可以使用(使用下面的代码)。有没有一种简单的方法可以将其应用于所有方法?e、 例如,可能使用app.all?或者我必须为每个方法添加代码吗带有JWT身份验证的Node.js API,node.js,express,jwt,Node.js,Express,Jwt,我有一个Node.js Express API,它没有任何安全性,现在我想修补基于JWT的授权 我有一个方法可以使用(使用下面的代码)。有没有一种简单的方法可以将其应用于所有方法?e、 例如,可能使用app.all?或者我必须为每个方法添加代码吗 app.get('/people/:id', ensureToken, (req, res, next) => { var id = req.params.id; getPerson(id, (err, people) => {
app.get('/people/:id', ensureToken, (req, res, next) => {
var id = req.params.id;
getPerson(id, (err, people) => {
if (err) {
next(err);
return;
}
jwt.verify(req.token, process.env.JWT_KEY, function(err, data) {
if (err) {
res.sendStatus(403);
} else {
res
.status(200)
.set('Content-Type', 'application/json')
.set("Connection", "close")
.send(person);
}
});
});
});
function ensureToken(req, res, next) {
const bearerHeader = req.headers["authorization"];
if (typeof bearerHeader !== 'undefined') {
const bearer = bearerHeader.split(" ");
const bearerToken = bearer[1];
req.token = bearerToken;
next();
} else {
res.sendStatus(403);
}
}
您可以执行以下操作:
app.use(function(req, res, next){
const bearerHeader = req.headers["authorization"];
if (typeof bearerHeader !== 'undefined') {
const bearer = bearerHeader.split(" ");
const bearerToken = bearer[1];
req.token = bearerToken;
next();
} else {
res.sendStatus(403);
}
});
我建议退房 您也可以将其用作中间件:
app.get('/people/:id', passport.authenticate('jwt', { session: false }), (req, res, next) => { });
与使用
app.use
相比,这种方法的优点在于,您可以指定应该对哪些路由进行身份验证。i、 例如,您可以排除登录
或注册
路由。不必侵入像if(req.path=='/login')
这样的检查,另一个优点是,如果您选择,您可以在以后添加额外的身份验证方法。还有相当多的社区支持。我用app.all实现了它,不包括检查中的登录路径:
app.all(process.env.API_BASE + "*", (req, res, next) => {
if (req.path.includes(process.env.API_BASE + "login")) return next();
return auth.authenticate((err, user, info) => {
if (err) { return next(err); }
if (!user) {
if (info.name === "TokenExpiredError") {
return res.status(401).json({ message: "Your token has expired. Please generate a new one" });
} else {
return res.status(401).json({ message: info.message });
}
}
app.set("user", user);
return next();
})(req, res, next);
});
这里的完整解决方案是:啊,我明白了。谢谢你的快速回复。今晚我将尝试使用此方法,您仍将包括
jwt。请验证路径中的。我不喜欢此解决方案中缺少对授权类型的检查。在这个具体的例子中,我们应该向我们保证,bearer[0]
确实包含关键字“bearer”(不区分大小写)谢谢,我已经考虑将其作为我的长期解决方案。