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

eqoofvh9  于 2023-02-12  发布在  Node.js
关注(0)|答案(3)|浏览(138)

我目前使用此代码登录:

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",
yeotifhr

yeotifhr1#

我在这个问题上花了点功夫,在两个地方定义usernameField是很重要的:
1.在创建localStrategy时(如Joseph最初的问题):

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

1.在定义用户模型时(如robertklep的回答):

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

iih3973s2#

默认情况下,LocalStrategy希望在名为username和password的参数中找到凭据。如果您的站点希望使用不同的名称命名这些字段,则可以使用选项来更改默认值。
读取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);
            })

        })
)
9wbgstp7

9wbgstp73#

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

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

(文件)
也可以用它来为你制定策略:

passport.use(User.createStrategy());

(文件)

相关问题