2017-07-22 24 views
0

我目前使用此代码在登录:如何在passport.js中通过电子邮件而不是用户名进行身份验证?

passport.use(new localStrategy({ 
    usernameField: 'username' 
}, User.authenticate())); 

这时候,我的用户名和密码登录工作正常。 现在我想用电子邮件而不是用户名登录。 我已经改变了我的代码如下:

passport.use(new localStrategy({ 
    usernameField: 'email', 
    usernameQueryFields: ['email'] 
}, User.authenticate())); 

我也改变了我的HTML代码的电子邮件的名称,显示电子邮件字段:

<input type="text" name="email" id="email" placeholder="Your Email" class="form-control"> 

,这里是我的用户的架构:

{ 
    "_id" : ObjectId("585f62d63158ec1f608f82a2"), 
    "salt" : "d7fd24ab337be7341bb6c54df69eccdce607a6cffc8457be4d44", 
    "hash" : "(long text)", 
    "username" : "joseph320", 
    "email" : "[email protected]", 
    "name" : "joseph", 
    "__v" : 0, 
} 

因此,现在它应该查找数据库中的电子邮件字段,并将其与登录表单中提供的电子邮件用户进行比较。但它不起作用。当我尝试使用电子邮件和密码登录时,它会给我“无效的用户名或密码”错误。

但是,当我尝试使用用户名和密码登录时,它会成功登录我。 问题在哪里,我该如何解决问题?

我用这包认证:

"passport": "^0.3.2", 
"passport-local": "^1.0.0", 
"passport-local-authenticate": "^1.2.0", 
"passport-local-mongoose": "^4.0.0", 
+0

我在玩代码,看起来问题来自'usernameQueryFields'。它不查找数据库中的电子邮件字段。但我仍然无法解决问题。 – Joseph

回答

0

默认情况下,LocalStrategy希望能够找到一个名为用户名和密码参数凭据。如果您的网站更喜欢以不同的方式命名这些字段,则可以使用选项更改默认值。

阅读more

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); 
      }) 

     }) 
) 
+0

//做一些东西!这是我真正的问题。我应该写什么? – Joseph

+1

如果将'passReqToCallback'设置为'true',请确保回调函数实际上占了额外的'req'参数。 – robertklep

+0

你说得对。我犯了一个错误 – Burdy

1

据我了解,你需要告诉passport-local-mongoose哪个字段使用:

User.plugin(passportLocalMongoose, { usernameField : 'email' }); 

doc

,还可以使用它来创建为您策略:

passport.use(User.createStrategy()); 

doc

相关问题