опция passwordValidator в паспорте локальный мангуст не работает - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь подтвердить пароль, во время регистрации, с паспортом местного мангуста, но он не работает.Это не выдает ошибку, но когда я регистрируюсь с паролем, который не соответствует критериям проверки, он принимается.Вот 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 голосов
/ 02 апреля 2019

Если вы используете passport-local-mongoose, модуль сам создаст соль и хеш и при проверке будет сравнивать сам пароль.Вам не нужно писать валидатор пароля для этого.

0 голосов
/ 26 февраля 2019

Вы не определили локальную стратегию Passport для passport-local-mongoose, поэтому вы так и получаете. Но в вашем коде не с чем сравнивать ваш пароль.Таким образом, без какой-либо локальной стратегии аутентификация будет всегда успешной.

Если вы используете Passport-local-mongoose, он создаст соль и сам хеш, используя заданный пароль.Следовательно, вам не нужно хранить свой пароль в мангусте.User.register() - это стандартная функция passport-local-mongoose для этого.Таким образом, ваша пользовательская схема должна выглядеть следующим образом:

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

Смотрите здесь, я не упомянул пароль в пользовательской схеме.

Тогда вы должны определить свою локальную стратегию для паспорта.Для Passport-local-mongoose это должно быть похоже на

passport.use(new LocalStrategy(User.authenticate()));, где user - ваша экспортированная userhema.

Если вы не используете passport-local-mongoose, то код локальной стратегии будет другимне такой, как приведенный выше.

Тогда вам следует выполнить сериализацию и десериализацию вашего паспорта.Это так для 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

...