护照本地猫鼬中的密码验证器选项不起作用
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 会被调用