这是一个可能的方法的快速草图:
请注意,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');
});