如何在角客户端处理passport-facebook回调?

时间:2016-01-12 14:21:09

标签: angularjs node.js passport.js passport-facebook

我正在开发一个MEAN应用程序。我使用护照进行身份验证 - 本地,脸书和谷歌策略。

我正在使用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']
    }));

我面临的问题是当用户点击"使用Facebook登录"按钮

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

客户将访问&#34; / auth / facebook&#34;最终将用户重定向到Facebook页面以验证用户凭据的路由。

验证成功后,用户将被重定向到路由&#34; / home&#34;在&#34; successRedirect&#34;中定义值。

现在问题是,我想使用自定义回调函数,而不是为成功或失败定义重定向。它将如下所示:

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

我在这里遇到的根本问题是,我不能使用上面的自定义回调,因为客户端没有调用&#34; auth / facebook / callback&#34;路线,由facebook调用。 所以,没有成功的处理程序等着赶上客户端回调的回应!!

我希望通过某种方式在客户端以json格式获取响应,以消除服务器端重定向,并在Facebook成功验证后将消息和用户名传递给客户端。

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

由于

1 个答案:

答案 0 :(得分:3)

这可以通过重定向到facebook回调处理程序中的另一个端点来实现。没有必要对来自facebook的回调进行res.json(),因为他们只向其发出请求,以便在auth失败或成功时通知您。 From their docs

// 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.

因此,当他们致电/auth/fb/callback时,facebook会将对请求流程的控制权返还给您,但这取决于您下一步该做什么。一旦用户成功通过身份验证,您就可以在整个会话期间使用req.user。此时,您可以重定向到示例/account中的内容,并检查req.user是否req.isAuthenticated()并完成您想要的流程。