0

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

因此,在注册后,用户已通过身份验证访问其 Twitter 帐户,并且访问令牌可以存储在数据库中。稍后我将使用它来访问 Twitter API。

诸如everyauth和之类的节点模块passport使用 OAuth 完成了很多繁重的工作,但它们似乎只提供了一种findOrCreateUser方法,它并没有提供很多喘息的空间来做我需要做的事情——也就是说,重定向到注册用户之前的注册表单,或者如果找到用户,只需照常登录即可。

4

2 回答 2

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');
});
于 2013-02-19T15:41:59.937 回答
0

稍微澄清一下。测试“if (req.user.isCompleteProfile())”可以是:

如果(req.user.isCompleteProfile)

即,您在 twitter 步骤中创建用户记录时创建一个字段“isCompleteProfile”,并将其标记为真或假,具体取决于您对用户的了解

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

if (isCompleteProfile(req))

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

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

而且,我对 Jared 和这个关于passportjs 身份验证的精彩教程表示赞同。

于 2015-08-15T14:04:12.113 回答