如何在没有重定向的情况下使用Passport-Facebook登录?

时间:2014-07-06 12:30:48

标签: ajax node.js cordova passport.js url-redirection

我正在构建一个在服务器端有nodejs的phonegap应用程序。我想使用passport-facebook策略实现登录,但是他们的回调指定了两个路由,/ successcallback和/ failurecallback。拥有单个页面应用程序,这使得将用户重定向到某某页面时非常困惑。

我不想从服务器提供静态文件(index.html,login.html),而是将它们放在客户端上,并要求客户端进行ajax调用。到目前为止,我能够将/ auth / facebook调用作为AJAX请求,但我无法在同一请求上收到任何响应,因为登录策略要求重定向用户。我宁愿在成功登录时向用户发送user_id或名称,或者在失败时向他显示登录表单(也在phonegap的www目录中)。但重定向和CORS错误阻止我这样做。有什么方法可以实现吗?我几周以来一直在寻找这个,但没有成功。我非常感谢你的帮助!

PS:我宁愿避免从节点服务器发送所有html和静态内容。

编辑:添加登录代码以便更好地理解:

app.get('/userpage', utility.isLoggedIn, function(req, res)
{
    res.send('User:'+req.user);
});

app.get('/', utility.isLoggedIn, function(req, res)
{
    res.redirect('/userpage');
});

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

app.get('/auth/facebook/callback',passport.authenticate('facebook',
{
    successRedirect : '/',
    failureRedirect : '/login'
}));

app.get('/logout', function(req, res)
{
    req.logout();
    res.redirect('/login');
});


utility.isLoggedIn:
function isLoggedIn(req, res, next)
{
    if (req.isAuthenticated())
    return next();

    res.redirect('/login');
}

2 个答案:

答案 0 :(得分:0)

您可以定义自己的函数而不是重定向,而不是使用护照提供的标准重定向。以下是该代码的示例

 passport.authenticate('login', function(err, user, info) {
      if (err) { return next(err); }
      if (!user) { return res.json({ status:"failed", "error": "Invalid credentials" }); }

// req / res held in closure
      req.logIn(user, function(err) {
          if (err) { return next(err); }

          return res.json({ "status":"success"});
      })
 })(req, res, next);

答案 1 :(得分:0)

你不能用facebook oAuth做到这一点,但Facebook提供another login solution,您可以在其中编写客户端应用程序代码以请求令牌,稍后您可以使用passport-facebook-token在服务器上进行验证。

通过这种方式,您可以将持久会话的优势用于持久会话,而不会出现恼人的重定向。