我正在尝试在Node.js
中编写一个使用passport-facebook
身份验证策略的Web应用程序。默认情况下,示例中提供的机制通过将用户重定向到Facebook API
来工作,用户可以在其中输入用户名和密码进行登录。一旦Facebook验证用户,它就会将令牌传递回我的应用程序中的回调URL。
现在这些东西适用于我的应用程序。我可以使用Facebook登录没有问题。但是当我尝试登录时,我希望将一个额外的字段传递给服务器。
基本上我的计划是在我的主页上添加TextField
和Login Button
。成功登录后,执行回调函数时,我想从此回调中捕获TextField
的值。有没有办法做到这一点?任何帮助都非常感谢。
这是我的HTML页面的正文
<body>
<div class="container">
<div class="jumbotron text-center">
<p>Login or Register with:</p>
<a href="/auth/facebook" class="btn btn-primary"><span class="fa fa-facebook"></span> Facebook</a>
</div>
</div>
</body>
这是我的nod.js
代码:
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback', passport.authenticate('facebook', {
successRedirect : '/dashboard',
failureRedirect : '/'
}));
app.get('/dashboard', isLoggedIn, function(req, res){
res.render('dashboard.ejs', {
user : {
name : req.user.facebook.name,
profilePic : req.user.facebook.profilePic
}
});
});
基本上我只想在TextField
按钮之前添加额外的LogIn
。从/dashboard
路线,我想获得TextField
的价值。所以/dashboard
的代码看起来像这样:
app.get('/dashboard', isLoggedIn, function(req, res){
res.render('dashboard.ejs', {
user : {
role: VALUE_FROM_TEXT_FIELD,
name : req.user.facebook.name,
profilePic : req.user.facebook.profilePic
}
});
});
所以我有一个双重问题:
1.如何从前端传递此TextField
值。它应该在Form
内还是什么?
2.如何捕获TextField
路径中/dashboard
的值?
答案 0 :(得分:0)
您是否考虑使用自定义回调而不是标准的Passport.js?
本地&#39;的一个例子。策略是:
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
您应该能够传递请求中的附加值并在回调中处理它。
编辑:对于您的特定情况,您可能正在寻找与此类似的内容......
app.get('/auth/facebook/callback', function (req, res, next) {
passport.authenticate('facebook', function (err, user, info) {
if (err) {
return next(err);
// let the next route handler do its thing...
// or you can handle the error yourself within this
// callback.
}
// if the user returns as nothing (doesn't exist) then redirect
if (!user) {
// this takes the place of failureRedirect
return res.redirect('/');
}
req.logIn(user, function (err) {
if (err) {
return next(err); // again - on error, 'next' depending on your requirement.
}
// this takes the place of successRedirect
return res.redirect('/dashboard');
});
})(req, res, next);
});
希望这澄清:)
答案 1 :(得分:0)
我所做的是传递自定义函数而不是使用sucessRedirect并将变量需要传递给它。在我的例子中,它是req.session.backurl,用于将它们发送回需要进行身份验证才能访问的页面。
users.get('/auth/facebook/callback',
//req.session.backURL||
passport.authenticate('facebook', { failureRedirect: '/login' }),function(req,res){
res.redirect(req.session.backURL||'/'); //custom function used instead of sucessRedirect
});