护照本地猫鼬中的passwordValidator选项不起作用

时间:2018-11-22 11:48:07

标签: node.js mongoose passport-local

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

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

如何获取它以验证密码?

2 个答案:

答案 0 :(得分:0)

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

如果您使用Passport-local-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())); 用户是您导出的用户位置。

如果您不使用护照-本地猫鼬,那么本地策略代码将有所不同,与上面给出的代码不同。

然后,您应该对护照进行序列化和反序列化。护照当地猫鼬是这样的

 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

答案 1 :(得分:0)

如果您使用的是护照本地猫鼬,该模块本身将创建一个盐和一个哈希,并且它将在身份验证时比较密码本身。您不必为此编写密码验证器。