使用Everyauth / Passport.js在Twitter上进行身份验证,同时要求输入用户名/电子邮件/密码

时间:2013-02-13 22:53:59

标签: express oauth twitter-oauth passport.js everyauth

我想创建一个用户可以“注册Twitter”的身份验证系统,但所有这些都有效地验证了他们的Twitter帐户并使用他们的Twitter用户名预填充注册表单。然后将要求用户输入电子邮件和密码(或替代用户名)。

因此,在注册时,用户已经认证了对其Twitter账户的访问权限,并且访问令牌可以存储在数据库中。稍后我将使用它来访问Twitter API。

everyauthpassport之类的节点模块使用OAuth完成了很多繁重工作,但它们似乎只提供findOrCreateUser方法,但不提供很多呼吸空间做我需要做的事情 - 也就是说,在注册用户之前重定向到注册表单,或者如果找到用户,只需按常规登录。

2 个答案:

答案 0 :(得分:3)

这是一个可能的方法的快速草图:

请注意,Passport不提供findOrCreateUser方法。所有数据库管理和记录创建都由您的应用程序定义(应该如此),Passport只提供身份验证设施。

这种方法的关键是从twitter提供的配置文件数据中简单地在数据库中创建“不完整”的用户记录。然后,在您的应用程序的路径中,您可以检查是否满足您需要的条件。如果没有,请将用户重定向到一个表单,提示他们填写遗漏的详细信息。

passport.use(new TwitterStrategy({
    consumerKey: TWITTER_CONSUMER_KEY,
    consumerSecret: TWITTER_CONSUMER_SECRET,
    callbackURL: "http://127.0.0.1:3000/auth/twitter/callback"
  },
  function(token, tokenSecret, profile, done) {
    // Create a user object in your database, using the profile data given by
    // Twitter.  It may not yet be a "complete" profile, but that will be handled
    // later.
    return done(null, user);
  }
));

app.get('/auth/twitter',
  passport.authenticate('twitter'));

app.get('/auth/twitter/callback', 
  passport.authenticate('twitter', { failureRedirect: '/login' }),
  function(req, res) {
    // The user has authenticated with Twitter.  Now check to see if the profile
    // is "complete".  If not, send them down a flow to fill out more details.
    if (req.user.isCompleteProfile()) {
      res.redirect('/home');
    } else {
      res.redirect('/complete-profile');
    }
  });

app.get('/complete-profile', function(req, res) {
  res.render('profile-form', { user: req.user });
});

app.post('/update-profile', function(req, res) {
  // Grab the missing information from the form and update the profile.
  res.redirect('/home');
});

答案 1 :(得分:0)

略作澄清。测试" if(req.user.isCompleteProfile())"可能是:

  

if(req.user.isCompleteProfile)

即,您创建了一个字段' isCompleteProfile'当你在twitter步骤中创建用户记录,并将其标记为true或false时,取决于你对用户的了解

或:它是对函数的调用,因此

  

if(isCompleteProfile(req))

在这种情况下,你有一个单独的函数来测试你刚刚创建/修改的用户的状态,因此:

  

function isCompleteProfile(req){       if(typeof req.user.local.email ===" undefined")return false;       否则返回true;   }

而且,我赞同Jared的赞美和这本关于身份验证的精彩教程。