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

标签 javascript node.js passport.js

我在我的 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;

最佳答案

好的,您的 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...
    });
};

关于javascript - 使用电子邮件或用户名的 Node.js Passport 策略登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958149/

相关文章:

javascript - 加载 Angular 应用程序时,Chrome devtools 挂起

node.js - 如何让Visual Studio代码识别 Mocha 中的 `before` 和 `after` 关键字?

javascript - 有效的 JWT 对于 NestJS 防护无效

javascript - 提交表单并将值保存到 sessionStorage

javascript - DataTables-以模态方式显示列数据

javascript - 实现 datapicker jqgrid 时出错

node.js - Sequelize – 用两个属性查询?

javascript - 如何使用自定义 Node 模块?

node.js - 如何在 NodeJS + Express 4 中获取 req.user.email

authentication - React-redux 客户端 token