如何在angular度客户端处理passport-facebookcallback?

我正在开发一个MEAN应用程序。 我正在使用护照进行身份validation – 本地,Facebook和谷歌战略。

我正在使用angularjs客户端。 所有的路由都在客户端处理。 我只使用服务器数据apis。

当使用passport-facebook策略时,我按照护照文档在节点服务器上使用下面的代码。

app.get('/auth/facebook',passport.authenticate('facebook-auth', { scope : ['email'] })); app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', { successRedirect : '/home', failureRedirect : '/login', scope:['email'] })); 

我面对的问题是当用户点击“使用Facebooklogin”button

 <a href="/auth/facebook" class="btn"><i class="fa fa-facebook"></i> Sign in using Facebook</a> 

客户端将访问“/ auth / facebook”路线,最终将用户redirect到Facebook页面以validation用户的凭证。

validation成功后,用户将被redirect到按照“successRedirect”值定义的路由“/ home”。

现在的事情是,我想使用自定义callback函数,而不是定义成功或失败的redirect。 它将如下所示:

 app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', function(err,user,info){ if(err){ throw err; } else if(user === 'userexists'){ res.json({ 'state':false, 'message':'User with this e-mail already exists' }); } else{ req.logIn(user,function(loginErr){ if(loginErr){ throw loginErr; } res.json({ 'state':true, 'message':'You logged in successfully!' }); }); } })); 

我在这里面临的根本问题,我不能使用上面的自定义callback,因为客户端不是调用“auth / facebook / callback”路由,它是由Facebook调用的。 所以,没有成功的处理者在客户端等待赶超callback响应!

我想要一些方式来获得在客户端的JSONforms的响应,以消除服务器端redirect,也成功的身份validation通过Facebook后,消息和用户名传递给客户端的方式。

我即将放弃护照。 在删除大量代码之前,希望能有任何可能的解决scheme!

谢谢

这可以通过redirect到Facebookcallback处理程序中的另一个端点来完成。 没有必要在facebook上的callback中做res.json() ,因为他们只是提出请求,以便让你知道auth失败或成功。 从他们的文档 :

 // GET /auth/facebook/callback // Use passport.authenticate() as route middleware to authenticate the // request. If authentication fails, the user will be redirected back to the // login page. Otherwise, the primary route function function will be called, // which, in this example, will redirect the user to the home page. 

所以,Facebook在调用/auth/fb/callback的时候/auth/fb/callback请求处理的控制权还给你,但是你接下来要做什么呢。 因为一旦用户成功通过身份validation,您就可以在整个会话中使用req.user 。 在这一点上,你可以redirect到像example /account这样的东西,并检查req.userreq.isAuthenticated()完成你想要的stream程。