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

Query the db from Angular to Nodejs with passportjs

我可以使用 passport-facebook 进行身份验证,并将用户 ID 和用户名从 facebook 存储到我的数据库中。我正在从 angular 控制器查询 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?
}));

我想将用户 ID 发送到 angular 以存储在 localStorage 中,并使用它来查询数据库以获取未来的请求。这是正确的方法吗?这是一个水疗中心。我看到在我的浏览器中创建了一个 connect.sid cookie。如果它有 userid 或我在 post/get 中发送 nodejs 通过会话识别的内容,我如何从中提取 userid

我读过但不明白这两件事到底是做什么的:

passport.serializeUser(function(user, done) {
    done(null, user.id);
});


passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
         done(err, user);
    });
}); 

非常感谢。

Facebook 身份验证机制 (oAuth) 是异步的,因此它的工作方式与您期望的不同。

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

简而言之,oauth 进程的工作方式是

  1. 用户单击 'Login with facebook' 按钮,该按钮应该硬重定向到“http://youserver/facebooklogin”(您还可以使用 iframe、对话框等做一些奇特的事情)
  2. 服务端调用app.get('/facebooklogin', passport.authenticate('facebook'));将通过您的应用凭据重定向到 facebook.com 进行响应。在这个阶段,用户实际上已经离开了你的应用程序。 Facebook 为用户处理登录,因此您永远看不到他们的 username/password 等
  3. 如果成功,Facebook 将通过会话 ID 将浏览器重定向回您的回调 URL。这是在 http://yourserver/facebook/callback 收到的。服务器端代码通常会以某种方式将其存储在用户会话中,即。在数据库中,一个 cookie,或者只是重定向到您的应用程序中的一个页面,该页面可以接收会话信息并将其保存在本地存储中。