护照本地猫鼬中的密码验证器选项不起作用

Posted

技术标签:

【中文标题】护照本地猫鼬中的密码验证器选项不起作用【英文标题】: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");
        )
    );
    )

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

【问题讨论】:

【参考方案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,模块本身将创建一个盐和哈希,并且在身份验证时它会比较密码本身。您不必为此编写密码验证器。

【讨论】:

以上是关于护照本地猫鼬中的密码验证器选项不起作用的主要内容,如果未能解决你的问题,请参考以下文章

扩展模式猫鼬中的“虚拟”继承方法不起作用

猫鼬中的保存功能不起作用

护照身份验证不起作用。从未调用过的 Passport.serializeUser 和 passport.deserializeUser 会被调用

使用数组过滤器更新多个嵌套数组在猫鼬中不起作用

在猫鼬中排序

Sails.js 与护照-http-bearer 身份验证不起作用