2014-01-06 4 views
6

Ich verwende Passport auf meiner node.js App und ich verwende derzeit einen Benutzernamen zu login.Node.js Passport-Strategie Login mit E-Mail oder Benutzername

Auf meiner Benutzerregisterseite kann der Benutzer seinen eindeutigen Benutzernamen und E-Mail-Adresse registrieren.

Ich möchte eine Login-Seite mit "Melden Sie sich mit Benutzername/E-Mail:" _ __ _ __ _ _

Wo das Skript erkennen kann, wenn es ein "@" ist in Feld und suchen Sie die E-Mail anstelle des Benutzernamens.

Ich habe für ein paar Stunden ohne Erfolg versucht.

hier ist mein 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); 
    })); 
} 

EDIT: unten die user.js ist als

angefordert
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

Wo ist der E-Mail/Benutzername-Erkennungsteil? Wahrscheinlich im Mungo-Modell? Es wäre hilfreich, einen Blick darauf werfen zu können. – bredikhin

+0

Vielen Dank für Ihre Antwort. Ich habe den Beitrag bearbeitet, um user.js zu enthalten – user3081516

Antwort

22

Ok, Sie so etwas wie dies in Ihrem Mongoose Modell haben sollte:

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

Vielen Dank Herr! Du schaukelst! – user3081516

+0

Fantastisch! Dies sollte, wenn möglich, Millionenbeträge enthalten. @bredikhin – Pei

5

es ist eher ein Mungo-Ding als ein Pass-Ding, und wenn Sie das ausprobieren können, benutzen Sie bredikhins Antwort^_^:

Der Schlüssel ist, einen Benutzer durch eine Frage von mongodb zu finden !!!
Auf diese Weise können Sie beliebige Abfrage haben, die Sie einen Benutzer finden möchten.

Verwandte Themen