Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nodejs + Passport: How to add more user information

I'm new to Nodejs and looking for a user credential management, I see that Passport a good option.

But in Passport's registration strategy, I only see that user information saved is email and password.

I need more user information like full name, job, registration time, last activity time, etc.

So how can I do this in Passport?

like image 713
Ryo Avatar asked Feb 27 '15 07:02

Ryo


Video Answer


2 Answers

Inside of your Passport.js signup/register strategy you should be able to just pass the request object in as the first parameter of that function and Passport will take care of passing your request into your function for you.

So you should be able to use the req.body object, get the data from your form that way and store that to your database.

Below is a more detailed example of how this would work.

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);
  });
);

Here is a tutorial that covers it in a bit more detail. I did change the firstName and lastName parameters from params to variables in the body. But you can either use params or body to get that data into your local strategy.

like image 171
Charlie Fish Avatar answered Oct 09 '22 04:10

Charlie Fish


when making a request for the newUser args other params should be requested from the form body like so newUser.local.fname = req.body.fname

like image 21
Tha Truth Avatar answered Oct 09 '22 03:10

Tha Truth