如何允许用户使用 node.js 通过用户名或电子邮件登录

Ste*_*hen 6 javascript authentication node.js passport.js

我有一个带护照的 node.js 登录系统,但我想弄清楚如何使用用户名或电子邮件登录用户。我只能使用电子邮件或用户名单独登录用户。我不知道如何编写代码来满足他们的用户名和电子邮件。因此,如果用户想使用用户名登录,他们可以,或者如果希望使用他们的电子邮件,他们也可以。这是我的 users.js 文件中的 localstrategy 代码:

passport.use(new LocalStrategy(
    function(email, password, done) {
        User.getUserByEmail(email, function(err, user, next){
            if(err) throw err;
            if(!user){
                return done(null, false, {message: 'Unknown user'});
            }

        User.comparePassword(password, user.password, function(err, isMatch){
            if(err) throw err;
            if(isMatch){
                return done(null, user);
            } else {
                return done(null, false, {message: 'Invalid password'});
            }
        });
        });
    }));
Run Code Online (Sandbox Code Playgroud)

这是我的 user.js 中的 module.exports:

module.exports.getUserByEmail = function(email, callback){
    var query = {email: email};
    User.findOne(query, callback);
}

module.exports.getUserById = function(id, callback){
    User.findById(id, callback);
}

module.exports.comparePassword = function(candidatePassword, hash, callback){
    bcrypt.compare(candidatePassword, hash, function(err, isMatch) {
        if(err) throw err;
        callback(null, isMatch);
    });
}
Run Code Online (Sandbox Code Playgroud)

上面的代码只允许用户使用他们的电子邮件登录。我希望用户有机会使用他们的电子邮件或用户名登录。

Ank*_*wal 0

您可以getUserById在 的回调内部使用getUserByEmail,以便两个查询都针对 或email运行username。如果您指定email,则将emailOrUserName获得该email值,然后User.getUserByEmail将返回用户,然后继续comparePassword

如果您有username,则将emailOrUserName获得该username值,然后User.getUserByEmail不会返回用户,因此它会执行User.getUserById,如果在那里找到用户,则它将继续,User.comparePassword否则它将返回Unknown user

passport.use(new LocalStrategy(
    function(emailOrUserName, password, done) {
        User.getUserByEmail(emailOrUserName, function(err, user, next){
            if(err) throw err;
            if(!user){
              User.getUserById(emailOrUserName, function(err, user, next){
                   if(err) throw err;
                   if(!user){
                      return done(null, false, {message: 'Unknown user'});
                   }
            }

        User.comparePassword(password, user.password, function(err, isMatch){
            if(err) throw err;
            if(isMatch){
                return done(null, user);
            } else {
                return done(null, false, {message: 'Invalid password'});
            }
        });
        });
    }));
Run Code Online (Sandbox Code Playgroud)