我正在尝试在注册过程中使用护照上的本地猫鼬来验证密码,但是它不起作用。它不会引发错误,但是当我使用不符合验证条件的密码注册时,它将被接受。这是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");
})
});
})
如何获取它以验证密码?
答案 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)
如果您使用的是护照本地猫鼬,该模块本身将创建一个盐和一个哈希,并且它将在身份验证时比较密码本身。您不必为此编写密码验证器。