【问题标题】:Node.js API with JWT authentication带有 JWT 身份验证的 Node.js API
【发布时间】:2018-04-19 07:08:42
【问题描述】:

我有一个没有任何安全性的 Node.js Express API,现在我正在寻找基于 JWT 的授权补丁。

我已经为一种方法工作(使用下面的代码)。有没有一种简单的方法可以将其应用于所有方法?例如,也许使用 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);
  }
}

【问题讨论】:

    标签: node.js express jwt


    【解决方案1】:

    你可以这样做:

    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);
      }
    });
    

    【讨论】:

    • 啊,我明白了。谢谢你的快速回复。我今晚试试
    • 有了这个你仍然会在你的路由中包含jwt.verify
    • 我不喜欢这个解决方案是缺少对授权类型的检查。在这个具体的例子中,我们应该向我们保证bearer[0] 确实包含关键字“bearer”(不区分大小写)
    【解决方案2】:

    我建议查看passport-jwt

    您也可以将其用作中间件:

    app.get('/people/:id', passport.authenticate('jwt', { session: false }), (req, res, next) => { });
    

    与使用app.use 相比,这样做的好处是您可以指定应该对哪些路由进行身份验证。即,您可以排除 loginregistration 路由。无需像if (req.path == '/login')那样破解检查。另一个优点是使用passport,您可以稍后添加其他身份验证方法,如果您选择的话。还有相当多的社区支持。

    【讨论】:

    • 谢谢,我已经考虑将其作为我的长期解决方案。
    【解决方案3】:

    我用 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);
    });
    

    这里的完整解决方案:https://jonathas.com/token-based-authentication-in-nodejs-with-passport-jwt-and-bcrypt/

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 2017-07-30
      • 2016-03-24
      • 2019-02-14
      • 2017-12-06
      • 2018-06-10
      • 1970-01-01
      • 2019-10-10
      • 2020-04-22
      相关资源
      最近更新 更多