繁体   English   中英

Node + Express,JWT 身份验证问题 - 我不太清楚

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

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

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

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;

现在,登录 controller 看起来像这样

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM