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)
})
我正在做我的第一个 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)
})