使用passportjs从Angular到Nodejs查询数据库

时间:2017-03-22 23:29:38

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

我可以使用passport-facebook进行身份验证,并将用户ID和用户名从facebook存储到我的数据库中。我正在从角度控制器查询nodejs:

MyApp.controller("FacebookLogin", function($scope, $http){

    $scope.login = function(){
    $http.get("/facebooklogin").then(function(response){
            if(response.data){
                console.log(response.data); // nothing is logged here
            } else {
                console.log("No Data");
            }
        });
    }
});

在节点中:

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

app.get('/auth/facebook/callback', passport.authenticate('facebook', function(err, user, info){
    console.log(err, user, info);
    if(err) throw err;
    // res.send(user);  //Do I send the user info from here?
}));

我想将userid发送到angular以存储在localStorage中,并使用它来查询db以获取将来的请求。这是正确的方法吗?这是SPA。我看到在我的浏览器中创建了connect.sid cookie。如果userid中有userid或我在post / get中发送了什么,我会通过会话识别出passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); ,那么如何从中提取compare [a] [b]

我读过但不明白这两件事究竟做了什么:

a

非常感谢。

1 个答案:

答案 0 :(得分:1)

facebook Auth机制(oAuth)是异步的,因此它的工作方式与您期望的不同。

你没有$ http.get(“/ facebooklogin”)。相反,您应该将浏览器重定向到'/ facebooklogin'

简要说明oauth流程的工作方式是

  1. 用户点击“使用Facebook登录”按钮,该按钮应该重定向到“source code”(您还可以使用iframe,对话框等进行精彩的操作)。
  2. 服务器端调用app.get('/ facebooklogin',passport.authenticate('facebook'));将通过重定向到facebook.com通过您的应用程序凭据进行回复。在此阶段,用户已经有效地离开了您的应用程序。 Facebook处理用户的登录,以便您永远不会看到他们的用户名/密码等。
  3. 如果成功,Facebook会将浏览器重定向回您的回调网址,并传递会话ID。这是在http://youserver/facebooklogin收到的。然后,服务器端代码通常以某种方式将其存储在用户会话中,即。在数据库中,使用cookie,或者只是重定向到应用中可以接收会话信息并将其保存在本地存储中的页面。