Node.js使用电子邮件或用户名登录Passport策略

  发布于 2023-02-06 11:00

我在我的node.js应用程序上使用Passport,我目前正在使用用户名登录.

在我的用户注册页面上,我允许用户注册其唯一的用户名和电子邮件.

我想要一个登录页面"使用用户名/电子邮件登录:" _ __ _ __ _ _

脚本可以检测字段中是否有"@"并查找电子邮件而不是用户名.

我试了好几个小时但没有用.

这是我的passport.js

var mongoose = require('mongoose')
var LocalStrategy = require('passport-local').Strategy

var User = mongoose.model('User');

module.exports = function(passport, config){

passport.serializeUser(function(user, done){
    done(null, user.id);
})

passport.deserializeUser(function(id, done) {
    User.findOne({ _id: id }, function (err, user) {
        done(err, user);
    });
});

passport.use(new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password'
    }, function(username, password, done) {
    User.isValidUserPassword(username, password, done);
    }));
}

编辑:下面是所请求的user.js

var mongoose = require('mongoose');
var hash = require('../util/hash.js');

UserSchema = mongoose.Schema({
username:  String,
email:      String,
salt:       String,
hash:       String
})

UserSchema.statics.signup = function(username, email, password, done){
var User = this;

hash(password, function(err, salt, hash){
    if(err) throw err;
    // if (err) return done(err);
    User.create({
        username : username,
        email: email,
        salt : salt,
        hash : hash
    }, function(err, user){
        if(err) throw err;
        // if (err) return done(err);
        done(null, user);
    });
});
}

UserSchema.statics.isValidUserPassword = function(username, password, done) {
this.findOne({username : username}, function(err, user){
    // if(err) throw err;
    if(err) return done(err);
    if(!user) return done(null, false, { message : 'Incorrect username.' });
    hash(password, user.salt, function(err, hash){
        if(err) return done(err);
        if(hash == user.hash) return done(null, user);
        done(null, false, {
            message : 'Incorrect password'
        });
    });
});
};

var User = mongoose.model("User", UserSchema);

module.exports = User;

bredikhin.. 24

好的,你的Mongoose模型应该有这样的东西:

UserSchema.statics.isValidUserPassword = function(username, password, done) {
    var criteria = (username.indexOf('@') === -1) ? {username: username} : {email: username};
    this.findOne(criteria, function(err, user){
        // All the same...
    });
};


alexgzhou.. 5

它是一个猫鼬而不是护照的东西,如果你可以尝试这个,使用bredikhin的答案^ _ ^:

var criteria = {$or: [{username: username}, {email: username}, {mobile: username}, {anything: username}]};

关键是通过mongodb的查询找到用户!
通过这种方式,您可以拥有任何想要查找用户的查询.

2 个回答
  • 好的,你的Mongoose模型应该有这样的东西:

    UserSchema.statics.isValidUserPassword = function(username, password, done) {
        var criteria = (username.indexOf('@') === -1) ? {username: username} : {email: username};
        this.findOne(criteria, function(err, user){
            // All the same...
        });
    };
    

    2023-02-06 11:01 回答
  • 它是一个猫鼬而不是护照的东西,如果你可以尝试这个,使用bredikhin的答案^ _ ^:

    var criteria = {$or: [{username: username}, {email: username}, {mobile: username}, {anything: username}]};
    

    关键是通过mongodb的查询找到用户!
    通过这种方式,您可以拥有任何想要查找用户的查询.

    2023-02-06 11:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有