【问题标题】:passwordValidator option in passport local mongoose doesn't work护照本地猫鼬中的密码验证器选项不起作用
【发布时间】:2019-04-25 02:26:43
【问题描述】:

我正在尝试在注册过程中使用护照本地猫鼬验证密码,但它不起作用。它不会引发错误,但是当我使用不符合验证条件的密码注册时,它会被接受。这是用户架构:

var UserSchema = new mongoose.Schema({
    email: {
        type: String,
        unique: true
    },
    password: String,
    displayname: String,
    firstName: String,
    lastName: String,
    resetPasswordToken: String,
    resetPasswordExpires: Date,
    avatar: String,
    Bio: String,
    isAdmin: {type: Boolean, default: false}

});

var passwordValidator = function(password, cb){
        var regex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/;
        if(!password.match(regex)){
            return cb(null, false)
        }
        return cb(null, true);
    }

UserSchema.plugin(passportLocalMongoose, {
    usernameField: "email",
    errorMessages: {
        IncorrectPasswordError: "Password incorrect",
        IncorrectUsernameError: "There is no account registered with that email",
        UserExistsError: "A user with the given email is already registered"
    },
    passwordValidator: passwordValidator
});
module.exports = mongoose.model("User", UserSchema);

注册码:

router.post("/register", upload.single("avatar"), function(req, res){
    cloudinary.v2.uploader.upload(req.file.path, function(err, result){
        if(err) {
            req.flash("error", err.message);
            return res.redirect("back");
        }
        var newUser = new User({displayname: req.body.displayname,
        firstName: req.body.firstName, 
        lastName: req.body.lastName, 
        email: req.body.email,
        Bio: req.body.bio,
        avatar : result.secure_url
       });

        if(req.body.adminCode === "secretcode123"){
          newUser.isAdmin = true;
       }



       User.register(newUser, req.body.password, function(err, user){
         if(err){
            console.log(err); 
            req.flash("error", err.message);
            return res.redirect("/register");
        }

        passport.authenticate("local")(req,res, function(){
            req.flash("success", "Welcome " + " " + user.displayname);
            res.redirect("/campground");
        })
    });
    })

我如何获得它来验证密码?

【问题讨论】:

    标签: node.js mongoose passport-local


    【解决方案1】:

    您没有为 passport-local-mongoose 定义 Passport 本地策略,这就是为什么您会这样。因此您的代码没有任何东西可以与您的密码进行比较。所以没有任何本地策略,每次认证都会成功。

    如果您使用 Passport-local-mongoose ,它将使用给定的密码创建一个盐和哈希。因此,您不必将密码存储在 mongoose 中。 User.register() 是一个默认的护照本地猫鼬功能。 所以你的用户模式应该看起来像

        var UserSchema = new mongoose.Schema({
    email: {  
        type: String,
        unique: true
    },
    name:String,
    address: String});
    

    请看这里我没有在用户架构中提到密码。

    然后您应该定义您的护照本地策略。对于 Passport-local-mongoose 应该是这样的

    passport.use(new LocalStrategy(User.authenticate())); 其中 user 是您导出的 usershema。

    如果你没有使用passport-local-mongoose,那么本地策略代码会有所不同,不像上面给出的那样。

    那么你应该对你的护照进行序列化和反序列化。护照本地猫鼬是这样的

     passport.serializeUser(User.serializeUser());
     passport.deserializeUser(User.deserializeUser());
    

    我想你已经知道像这样初始化护照

    app.use(passport.initialize());     
    app.use(passport.session())
    

    现在是进行身份验证的时候了。代码是

      `passport.authenticate('local',function (err, user, info) { if(err){
       res.redirect("/register");
         } else{
          if (! user) {
           res.redirect("/register");
          } else{
            req.login(user, function(err){
              if(err){
                 res.redirect("/register");
              }else{
            res.redirect("/campground");`
              }
            })
          }
         }
      })(req, res);`
    

    如果您想显示来自 passport-local-mongoose 的错误消息,您可以控制台来自 passport.authenticate 的信息。

    如果您想了解更多详情,请通过https://github.com/saintedlama/passport-local-mongoose

    【讨论】:

      【解决方案2】:

      如果您使用的是 passport-local-mongoose,模块本身将创建一个盐和哈希,并且在身份验证时它会比较密码本身。您不必为此编写密码验证器。

      【讨论】:

        猜你喜欢
        • 2018-07-31
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        • 2018-01-20
        • 2016-10-29
        • 1970-01-01
        相关资源
        最近更新 更多