如何解决Node + Express,JWT 身份验证问题 - 我不太明白
我正在做我的第一个 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,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,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)
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。