Node + Express, JWT auth problem - 没看明白

Node + Express, JWT auth problem - I don't understand it clearly

我正在做我的第一个 MERN 堆栈项目,我不了解 JWT,我看了很多图,我明白了这个概念,但是当涉及到实现时,我就是做不到。 :/

所以,我这里有几条路线。我为他们做了控制器 最后一个(用户)应该受到保护

const router = express.Router();

const authController = require("../controllers/auth.controller");
const auth = require("../middleware/authorization");

router.post("/register", authController.register);
router.post("/login", authController.login);
router.get("/user", auth(), (req, res) => {
  res.json({ status: "ok" });
});

module.exports = router;

现在,登录控制器看起来像这样

exports.login = async (req, res, next) => {
  try {
    const { email, password } = req.body;

    if (!email || !password) {
      return res.json({ Error: "All fields are required" });
    }

    User.findOne({ email }, function (err, user) {
      if (err) return err;

      if (!user) return res.json({ Error: "This user doesnt exists" });

      user.comparePassword(password, function (err, isMatch) {
        if (err) return err;
        if (isMatch === false) return err;
      });

      const payload = { _id: user._id };
      const token = jwt.sign(payload, jwt_secret);

      res.cookie("token", token, {
        httpOnly: true,
        secure: true,
        expire: new Date() + 3000,
      });

      return res.json({ status: "ok", token: token, id: payload });
    });
  } catch (error) {
    next(error);
  }
};

我为 cookie 保存了令牌。现在我想用授权中间件检查用户是否被授权进入受保护的路由。

const jwt = require("jsonwebtoken");
const passport = require("passport");

const User = require("../models/user.model");

const authorize = (req, res, next) =>
  passport.authenticate("jwt", { session: false });

module.exports = authorize;

我该怎么做?然后什么?在这一点上我完全迷路了。我的代码是否安全可靠?

const { jwt_secret } = require("./variables");
const User = require("../models/user.model");
const passportJwt = require("passport-jwt");

const ExtractJwt = passportJwt.ExtractJwt;
const JwtStrategy = passportJwt.Strategy;

const jwtOptions = {
  secretOrKey: jwt_secret,
  jwtFromSecret: ExtractJwt.fromAuthHeaderAsBearerToken(),
};

const jwtStrategy = new JwtStrategy(jwtOptions, (payload, done) => {
  User.findById(payload.sub, (err, user) => {
    if (err) {
      return done(err, null);
    }
    if (user) {
      return done(null, user);
    } else {
      return done(null, false);
    }
  });
});

exports.jwt = jwtStrategy;

此外,我已经实施了 JWT 策略,但我不明白我应该在什么“点”使用它。

如果有人能够帮助我 - 我真的很感激,因为我几乎被困住了。非常喜欢你们。

创建 Passport 是为了能够以一种简单的方式使用不同的身份验证/授权机制,您可以使用许多策略,例如 JWT 或 OAuth2 等...但是所有策略都做同样的事情,给定一组凭据,检索用户或失败。

在您的情况下,您已经实施了 JWT 策略,但我不确定您是否注册了护照以便能够使用它

http://www.passportjs.org/docs/configure/

passport.use(jwtStrategy)

之后,为了能够对请求进行身份验证,您可以简单地将护照中间件添加到您的路由处理程序

http://www.passportjs.org/docs/authenticate/

router.get('/user', passport.authenticate('jwt'), (req, res) => {
  /** The authenticated user **/
  return res.json(req.user)
})