如何通过电子邮件进行身份验证而不是passport.js中的用户名?

时间:2017-07-22 04:04:09

标签: node.js passport.js passport-local

我目前正在使用此代码登录:

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" : "joseph@gmail.co",
    "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",

3 个答案:

答案 0 :(得分:2)

根据我的理解,您需要告诉passport-local-mongoose使用哪个字段:

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

doc

并使用它为您创建策略:

passport.use(User.createStrategy());

doc

答案 1 :(得分:1)

默认情况下,LocalStrategy希望在名为username和password的参数中查找凭据。如果您的网站更喜欢以不同方式命名这些字段,则可以使用选项更改默认值。

阅读more

insert into catalog_product_entity_int (entity_type_id, attribute_id, store_id, entity_id, value) select entity_type_id, attribute_id, store_id, entity_id, value from catalog_product_entity_text where attribute_id = '81';

答案 2 :(得分:1)

我为此挣扎了一下。请务必在两个地方定义usernameField

  1. 在创建localStrategy时(如约瑟夫的原始问题):

    passport.use(new localStrategy({
      usernameField: 'username'
    }, User.authenticate()));
    
  2. 在定义用户模型时(如robertklep的回答):

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