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

标签 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",

最佳答案

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

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

( doc )

也可以用它来为您制定策略:

passport.use(User.createStrategy());

( doc )

关于node.js - 如何通过电子邮件而不是 passport.js 中的用户名进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45250545/

相关文章:

node.js - 带有 Passport 的 Nodejs/Express 路由返回未定义的 req.url

javascript - 'express' 不是内部或外部命令,也不是可运行的程序 或批处理文件

javascript - 对 Passport 的 Ajax 调用不运行身份验证中间件

node.js - 将用户保存到 MongoDB 的 Passport Facebook 策略

node.js - 带有本地 token 和 Mysql 的 Nodejs Passport

javascript - 使用 Websockets 和 Nodejs 上传文件

node.js - 如何确保我的 node.js 处理程序在返回值之前完成 api 调用?

javascript - 使用 sailsjs Passport 身份验证本地策略既不会给出任何错误,也不会对用户进行身份验证

node.js - Mocha Chai 测试 protected 路线

node.js - Passport 的 req.isAuthenticated 总是返回 false,即使我硬编码 done(null, true)