2014-01-06 112 views
6

我在我的node.js应用程序上使用Passport,我正在使用用户名登录。Node.js通过电子邮件或用户名登录策略登录

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

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

在哪里,如果有一个 “@” 的脚本可以检测该字段并查找电子邮件而不是用户名。

我已经尝试了几个小时无济于事。

这里是我的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); 
    })); 
} 

编辑:下面是要求

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; 
+0

电子邮件/用户名检测部分在哪里?可能在Mongoose模型中?能够看一看会很有帮助。 – bredikhin

+0

感谢您的回复。我已编辑帖子,以包含user.js – user3081516

回答

22

OK了user.js的,你应该有这样的事情在你的猫鼬型号:

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... 
    }); 
}; 
+1

非常感谢您的先生!你摇滚! – user3081516

+0

太棒了!如果可能的话,这应该有数百万的赞扬。 @bredikhin – Pei

5

其猫鼬的事情,而不是护照的事情,如果你可以试试这个,使用bredikhin的答案^ _^:

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

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

相关问题