我想创建一个用户可以“注册Twitter”的身份验证系统,但所有这些都有效地验证了他们的Twitter帐户并使用他们的Twitter用户名预填充注册表单。然后将要求用户输入电子邮件和密码(或替代用户名)。
因此,在注册时,用户已经认证了对其Twitter账户的访问权限,并且访问令牌可以存储在数据库中。稍后我将使用它来访问Twitter API。
everyauth
和passport
之类的节点模块使用OAuth完成了很多繁重工作,但它们似乎只提供findOrCreateUser
方法,但不提供很多呼吸空间做我需要做的事情 - 也就是说,在注册用户之前重定向到注册表单,或者如果找到用户,只需按常规登录。
答案 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的赞美和这本关于身份验证的精彩教程。