【问题标题】:Nodejs + Passport: How to add more user informationNodejs + Passport:如何添加更多用户信息
【发布时间】:2015-04-29 20:55:23
【问题描述】:

我是 Nodejs 的新手,正在寻找用户凭证管理,我认为 Passport 是一个不错的选择。

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

我需要更多用户信息,例如全名、工作、注册时间、上次活动时间等。

那么我如何在 Passport 中做到这一点?

【问题讨论】:

    标签: node.js passport.js


    【解决方案1】:

    在您的 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);
      });
    );
    

    这是一个tutorial,它更详细地介绍了它。我确实将 firstName 和 lastName 参数从 params 更改为正文中的变量。但是您可以使用 params 或 body 将这些数据纳入您的本地策略。

    【讨论】:

      【解决方案2】:

      我发现这效果更好。在请求、用户名、密码之后但在您希望传递给函数的其他变量之前完成似乎是关键。如果 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);
                        });
                    }
                });
      
      
      
      
          });
      }));
      

      【讨论】:

      • args req、username password 和 done 都可以……但是我们如何传递额外的参数,例如 fname、lname 等……?首先,实际上从哪里获取用户名和密码..?来自 req.body 或其他地方..?提前谢谢..
      【解决方案3】:

      当请求 newUser args 时,应该像这样从表单主体请求其他参数 newUser.local.fname = req.body.fname

      【讨论】:

        猜你喜欢
        • 2012-12-24
        • 2018-04-13
        • 2019-07-10
        • 2020-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        相关资源
        最近更新 更多