【问题标题】:Do you need both JWT and Passport in a Node app?您是否需要在 Node 应用程序中同时使用 JWT 和 Passport?
【发布时间】:2020-04-23 14:36:36
【问题描述】:

我正在尝试了解我正在构建的 MERN 应用的用户登录身份验证过程。我看到很多教程同时使用passportjwt,我很难理解为什么我会同时使用两者而不是只使用其中一个。我的偏好是使用jwt,但如果有理由不使用,我将使用passport,或两者兼而有之。

例如,这是一个/login 路由,它向用户返回一个jwt

app.post('/login', (req, res, next) => {
  let query = { email: req.body.email };
  let entered_password = req.body.password;

  User.findOne(query, (err, user) => {
    if (err) { console.log(err); }
    if (!user) {
      return res.json({ message: "Invalid authorization" });
    }

    // returned from user object stored in mongodb
    let bcrypted_password = user.password;

    // put password entered on login page through bcrypt and compare it to the hashed password
    bcrypt.compare(entered_password, bcrypted_password, (error, isMatch) => {
      if (error) { console.log(error); }
      else {

        if (isMatch) {

          // passwords match, so create a jwt token for user
          jwt.sign({ email: req.user.email },
            process.env.JWT_KEY,
            { expiresIn: "24h" },
            (jwt_err, token) => {

            if (jwt_err) {
              return res.sendStatus(402);
            }

            else {
              // token created, now return it to user
              return res.json({ token });
            }
          });
        }

        else { // passwords do not match
          return res.json({ message: "Invalid authorization" });
        }
      }
    });
  });
});

这个jwt 被返回给用户并存储在localStorage 中。然后当用户尝试访问受保护的路由时,我发送令牌并使用verifyToken 中间件来检查令牌是否有效:

const verifyToken = (req, res, next) => {
  let token = req.body.token;
  jwt.verify(token, process.env.JWT_KEY, (err, authData) => {
    if(err) {
      res.json({ message: "Authentication failed" });
    }
    else {
      // verification worked
      next();
    }
  });
}

我错过了什么吗?这有什么问题吗?在有或没有passport 的情况下使用jwt 的优点/缺点是什么?

【问题讨论】:

    标签: node.js express jwt passport.js


    【解决方案1】:

    我使用了您在这篇文章中概述的类似方法,并且没有发现需要使用护照。

    Passprt 不是必需的,但人们可以更轻松地开始工作(并可能避免安全隐患)。

    如果您有能力,那么定制解决方案是可以接受的。我个人将 JWT 签名的 UserId 放在 cookie 中,使用中间件检查它,然后将其添加到请求对象中(使其可用 req.userId 而不是 req.body

    【讨论】:

    • 不用担心,有人可能会为您提供更好的答案/案例支持/反对 Passport,这只是我的两分钱。
    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 2012-11-08
    • 2019-06-30
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多