带有JWT身份验证的Node.js API

带有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) => {

我有一个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) => {
    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”(不区分大小写)谢谢,我已经考虑将其作为我的长期解决方案。