如何使用Passport-Facebooklogin而不redirect?

我正在构build一个phonegap应用程序,它将在服务器端有nodejs。 我想要使​​用passport-facebook策略来实现login,但是它们的callback指定了两个path/ successcallback和/ failurecallback。 有一个单一的页面应用程序,这使得用户redirect到某个页面非常混乱。

我不想从服务器提供静态文件(index.html,login.html),而是让它们在客户端上,并要求客户端进行ajax调用。 到目前为止,我可以将/ auth / facebook调用作为AJAX请求,但由于login策略要求用户redirect,因此我无法收到相同请求的任何响应。 我宁愿要发送一个user_id或名称回成功login用户或向他展示login表单(这也是在电话号码www目录)在失败。 但redirect和CORS错误阻止我这样做。 有什么办法可以实现这个吗? 自从几个星期以来,我一直在寻找这个,但没有成功。 我真的很感谢你的帮助!

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

编辑:添加login代码,以更好地理解:

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'); } 

而不是使用护照提供的标准redirect,你可以定义自己的function,而不是redirect。 下面是一个代码的例子

  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); 

你不能用facebook oAuth做到这一点,但Facebook提供了另外一个login解决scheme ,你可以在这里编写你的客户端应用程序来请求一个令牌,然后你可以使用passport-facebook-token在服务器上进行validation。

通过这种方式,您可以使用护照的优势进行永久会话,而无需烦人的redirect。