Jos*_*eph 4 node.js passport-local passport.js
我目前正在使用此代码登录:
passport.use(new localStrategy({
usernameField: 'username'
}, User.authenticate()));
Run Code Online (Sandbox Code Playgroud)
当我使用用户名和密码登录时,这很好用。现在我想用电子邮件而不是用户名登录。我已将代码更改为:
passport.use(new localStrategy({
usernameField: 'email',
usernameQueryFields: ['email']
}, User.authenticate()));
Run Code Online (Sandbox Code Playgroud)
我还更改了我的 HTML 代码以显示带有电子邮件名称的电子邮件字段:
<input type="text" name="email" id="email" placeholder="Your Email" class="form-control">
Run Code Online (Sandbox Code Playgroud)
这是我的用户的架构:
{
"_id" : ObjectId("585f62d63158ec1f608f82a2"),
"salt" : "d7fd24ab337be7341bb6c54df69eccdce607a6cffc8457be4d44",
"hash" : "(long text)",
"username" : "joseph320",
"email" : "joseph@gmail.co",
"name" : "joseph",
"__v" : 0,
}
Run Code Online (Sandbox Code Playgroud)
所以现在它应该在数据库中查找电子邮件字段,并将其与登录表单中提供的电子邮件用户进行比较。但它不起作用。当我尝试使用电子邮件和密码登录时,它给了我“无效的用户名或密码”错误。
但是当我尝试使用用户名和确切密码登录时,它会成功登录。问题出在哪里,我该如何解决?
我正在使用此软件包进行身份验证:
"passport": "^0.3.2",
"passport-local": "^1.0.0",
"passport-local-authenticate": "^1.2.0",
"passport-local-mongoose": "^4.0.0",
Run Code Online (Sandbox Code Playgroud)
据我了解,您需要说明passport-local-mongoose要使用哪个字段:
User.plugin(passportLocalMongoose, { usernameField : 'email' });
Run Code Online (Sandbox Code Playgroud)
(文档)
并使用它为您创建策略:
passport.use(User.createStrategy());
Run Code Online (Sandbox Code Playgroud)
(文档)
小智 6
我在这个问题上挣扎了一段时间。重要的是您必须usernameField在两个地方进行定义:
创建您的时localStrategy(如约瑟夫最初的问题):
passport.use(new localStrategy({
usernameField: 'email'
}, User.authenticate()));
Run Code Online (Sandbox Code Playgroud)
定义用户模型时(如 robertklep 的回答):
userSchema.plugin(passportLocalMongoose,
{
usernameField: 'email'
});
Run Code Online (Sandbox Code Playgroud)
默认情况下,LocalStrategy 希望在名为用户名和密码的参数中查找凭据。如果您的站点希望以不同的方式命名这些字段,则可以使用选项来更改默认值。
阅读更多:
passport.use(
'local-signup',
new LocalStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
},
function(req, username, password, done) {
User.findOne({email: username}, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
})
})
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5317 次 |
| 最近记录: |