angularjs - 如何在 Angular 客户端中处理 passport-facebook 回调?

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

我正在开发一个 MEAN 应用程序。我正在使用 Passport 进行身份验证 - 本地、Facebook 和谷歌策略。

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

当使用 passport-facebook 策略时,我根据 passport 文档在 Node 服务器上使用以下代码。

    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>

客户端将访问“/auth/facebook”路由,最终将用户重定向到 facebook 页面以验证用户的凭据。

验证成功后,用户将被重定向到“successRedirect”值中定义的路由“/home”。

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

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

我在这里面临的根本问题是,我不能使用上面的自定义回调,因为客户端没有调用“auth/facebook/callback”路由,它是由 facebook 调用的。 因此,没有成功处理程序等待在客户端捕获上述回调的响应!!

我想要一些方法在客户端获得 json 格式的响应,以消除服务器端重定向,以及在 facebook 成功验证后将消息和用户名传递给客户端的方法。

我要放弃 Passport 了。希望在删除大量代码之前找到任何可能的解决方案!

谢谢

最佳答案

这可以通过重定向到 facebook 回调处理程序内的另一个端点来完成。没有必要对来自 facebook 的回调执行 res.json(),因为他们只向它发出请求,以便让您知道身份验证是失败还是成功。 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.

因此,当 facebook 调用 /auth/fb/callback 时,Facebook 会将对请求过程的控制权返回给您,但接下来要做什么取决于您。因为一旦用户成功通过身份验证,您就可以在整个 session 期间使用 req.user。此时,您可以重定向到示例中的 have /account 并检查 req.user 是否具有 req.isAuthenticated()并完成您想要的流程。

关于angularjs - 如何在 Angular 客户端中处理 passport-facebook 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34746132/

相关文章:

node.js - 使用 Jest 简单模拟 Passport 功能

node.js - 无法使用带有 Passport 本地nodejs的电子邮件进行身份验证..尝试了几个示例

html - Angular.js 模板到纯 html

angularjs - 我的 AngularJS 应用程序的谷歌索引

angularjs - ChartJS折线图导致浏览器崩溃

actionscript-3 - Flash+Node.JS+Socket.io 卡在握手授权

javascript - 无法复制变量内的内容

javascript - 如何从 NodeJS 连接到 PostgreSQL

node.js - 使用 Passport 创建用户

javascript - AngularJS 不会验证 ng-show 隐藏的表单元素的输入