2014-01-06 152 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找到用戶!!!
通過這種方式,您可以擁有任何想要查找用戶的查詢。

相關問題