2015-02-27 16 views
8

Ich bin neu bei Nodejs und auf der Suche nach einem Benutzer-Credential-Management, sehe ich, dass Passport eine gute Option ist.Nodejs + Passport: So fügen Sie weitere Benutzerinformationen hinzu

Aber in Passports Registrierungsstrategie sehe ich nur, dass die gespeicherten Benutzerinformationen Email und Passwort sind.

ich mehr Benutzerinformationen wie vollständigen Namen benötigen, Job, Registrierung Zeit, letzte Aktivität Zeit usw.

Also, wie kann ich dies tun in Passport?

Antwort

5

Innerhalb Ihrer Passport.js Registrierungsstrategie sollten Sie in der Lage sein, das Anfrageobjekt einfach als ersten Parameter dieser Funktion zu übergeben, und Passport kümmert sich darum, Ihre Anfrage an Sie zu übergeben.

So sollten Sie in der Lage sein, das req.body Objekt zu verwenden, die Daten von Ihrem Formular auf diese Weise zu erhalten und das in Ihrer Datenbank zu speichern.

Im Folgenden finden Sie ein detaillierteres Beispiel, wie dies funktionieren würde.

passport.use('signup', new LocalStrategy({ 
    passReqToCallback : true 
    }, 
    function(req, username, password, done) { 
    findOrCreateUser = function(){ 
     // find a user in Mongo with provided username 
     User.findOne({'username':username},function(err, user) { 
     // In case of any error return 
     if (err){ 
      console.log('Error in Signup: ' + err); 
      return done(err); 
     } 
     // already exists 
     if (user) { 
      console.log('User already exists'); 
      return done(null, false, 
      req.flash('message','User Already Exists')); 
     } else { 
      // if there is no user with that email 
      // create the user 
      var newUser = new User(); 
      // set the user's local credentials 
      newUser.username = username; 
      newUser.password = createHash(password); 
      newUser.firstName = req.body.firstName; 
      newUser.lastName = req.body.lastName; 

      // save the user 
      newUser.save(function(err) { 
      if (err){ 
       console.log('Error in Saving user: '+err); 
       throw err; 
      } 
      console.log('User Registration succesful');  
      return done(null, newUser); 
      }); 
     } 
     }); 
    }; 

    // Delay the execution of findOrCreateUser and execute 
    // the method in the next tick of the event loop 
    process.nextTick(findOrCreateUser); 
    }); 
); 

Hier ist ein tutorial, die es in etwas mehr Detail abdeckt. Ich habe die Parameter firstName und lastName von params in Variablen im body geändert. Sie können jedoch entweder params oder body verwenden, um diese Daten in Ihre lokale Strategie zu übertragen.

-1

Ich fand, dass dies besser funktionierte. Es schien der Schlüssel zu sein, dass das getan werden nach dem req, Benutzernamen, Passwort, aber vor den anderen Variablen, die Sie in die Funktion übergeben möchten. Wenn fertig, wurde am Ende dann platziert:

events.js:160 throw er; // Unhandled 'error' event TypeError: done is not a function 

würde zurückgegeben werden.

// ========================================================================= 
// LOCAL SIGNUP ============================================================ 
// ========================================================================= 
// we are using named strategies since we have one for login and one for signup 
// by default, if there was no name, it would just be called 'local' 

passport.use('local-signup', new LocalStrategy({ 
    // by default, local strategy uses username and password, we will override with email 
    usernameField : 'username', 
    passwordField : 'password', 
    passReqToCallback : true // allows us to pass back the entire request to the callback 
}, 
function(req, username, password, done, fname, lname, email, security_question, security_answer) { 

    // asynchronous 
    // User.findOne wont fire unless data is sent back 
    process.nextTick(function() { 

    // find a user whose email is the same as the forms email 
    // we are checking to see if the user trying to login already exists 

      User.findOne({ 'local.username' : username }, function(err, user) { 
       // if there are any errors, return the error 
       if (err) 
        return done(err); 

       // check to see if theres already a user with that email 
       if (user) { 
        return done(null, false, req.flash('signupMessage', 'That username is already taken.')); 
       } else { 

        // if there is no user with that email 
        // create the user 
        var newUser   = new User(); 

        // set the user's local credentials 
        newUser.local.fname = fname; 
        newUser.local.lname = lname; 
        newUser.local.username = username; 
        newUser.local.email = email; 
        newUser.local.password = newUser.generateHash(password); 
        newUser.local.security_question = security_question; 
        newUser.local.security_answer = newUser.generateHash(security_answer); 

        // save the user 
        newUser.save(function(err) { 
         if (err) 
          throw err; 
         return done(null, newUser); 
        }); 
       } 
      }); 




    }); 
})); 
+0

die args req, benutzername passwort und fertig sind okay ... aber wie können wir zusätzliche params wie fname, lname etc ...? vor allem, von wo aus wird es Benutzername und Passwort nehmen ..? von req.body oder von wo wo sonst ..? Danke im Voraus.. – shivaraj