【问题标题】:Query the db from Angular to Nodejs with passportjs使用passportjs从Angular查询数据库到Nodejs
【发布时间】:2017-03-23 08:16:02
【问题描述】:

我可以使用 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?
}));

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

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

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


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

非常感谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 有道理。所以我需要使用会话信息并创建 localStorage cookie?但它是一个单页应用程序,所以应用程序中没有其他页面。由于不需要 Angular 控制器,我从哪里将 cookie 存储在本地存储中?
    • 您的 /facebook/callback 的服务器端处理程序将使您的客户端应用程序正常呈现(即重定向到应用程序的根目录,或者登录用户期望结束的任何地方),但是还以某种方式传递 facebook 会话信息(设置 cookie,将参数附加到 url 等)。然后,您的 Angular 代码将查找此 cookie 或参数并做出相应的响应(将其存储在本地存储中,显示不同的视图等)
    • 效果很好。谢谢师父..鞠躬
    猜你喜欢
    • 2017-07-24
    • 2017-11-24
    • 2018-04-02
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多