[英]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.