Nodejs + Passport:如何添加更多用户信息

9

我是Nodejs的新手,正在寻找用户凭据管理方案,我发现Passport是一个不错的选择。

但是在Passport的注册策略中,我只看到保存的用户信息是电子邮件和密码。

我需要更多的用户信息,比如全名、职业、注册时间、上次活动时间等。

那么,在Passport中我该如何实现这些需求呢?

3个回答

7
在您的 Passport.js 注册/登录策略中,您应该能够将请求对象作为该函数的第一个参数传递进去,Passport 将负责将您的请求传递到您的函数中。
因此,您应该能够使用 req.body 对象,以这种方式获取表单数据并将其存储到数据库中。
下面是更详细的示例说明。
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);
  });
);

这是一个涵盖了更多细节的教程。我已经将firstName和lastName参数从params变成了body中的变量。但你可以使用params或body将数据传递给你的本地策略。

1

当请求新用户参数时,其他参数应该从表单主体中请求,如下所示newUser.local.fname = req.body.fname


-1
我发现这个方法更好。似乎关键是在 req、username、password 之后,但在你想传递到函数中的其他变量之前放置 done。如果将 done 放在最后,则:
events.js:160 throw er; // Unhandled 'error' event TypeError: done is not a function

将会被返回。

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




    });
}));

参数req、username、password和done都没问题,但我们如何传递额外的参数,比如fname、lname等等呢?首先,实际上它会从哪里获取用户名和密码呢?是从req.body还是其他地方获取呢?提前感谢。 - Yuvaraj V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接