【问题标题】:Facebook Authentication Without Redirect?没有重定向的 Facebook 身份验证?
【发布时间】:2011-07-21 05:20:10
【问题描述】:

有没有办法在不重定向的情况下使用 facebook 身份验证(OAuth 2.0)?

我没有使用 facebook 登录按钮,所以我应该重定向到 https://www.facebook.com/dialog/oauth? client_id=YOUR_APP_ID&redirect_uri=YOUR_URL,但我不想将我的用户重定向到我的页面之外。有没有办法在弹出窗口中打开这个 url(顺便说一句,我该怎么做?),然后像使用普通的 facebook 登录按钮一样捕获 sessionChange 事件?
我正在使用 jQuery 和 Pyramid。

谢谢!

【问题讨论】:

    标签: facebook redirect login


    【解决方案1】:

    几周前我为一个客户做了一个应用程序,只是使用了 Facebook JS SDK

    FB.login(function(response){
            if(response.session){
            var user_id = response.session.uid,
                access_token = response.session.access_token;
            }
        }
    );
    

    如果需要,您可以使用 ajax 将 access_token 发送到您的服务器。请注意,如果您使用了过多的 ajax,如果您不经常调用 FB.getLoginStatus(),会话将会过期。

    【讨论】:

    • 通过弹出窗口完成。这意味着您只能从点击事件等用户操作中调用它,否则浏览器可能会阻止它。
    • 谢谢!我有一个使用 facebook auth 的 Pyramid 应用程序。我知道有两种类型的 facebook 用户身份验证 - 客户端和服务器端。我目前只使用客户端,因为只在 js 中访问用户的数据对我来说是可以的。我正在考虑安全性,但我不确定这是否强大。我的网站包含一个由登录用户提交的表单。由于我无法对登录状态进行服务器端检查,因此任何人都可以在技术上提交表单,即使没有登录 - 只需操作 js,对吗?服务器端身份验证是唯一的方法吗?
    • @Raiders 服务器端检查也会更安全。我不确定您将如何在 Pyramid 中执行此操作,但基本上我在 FB.login() 之后使用 ajax 并将 user_id 和 access_token 发送到服务器。然后我在服务器端使用 cURL 向https://graph.facebook.com/me?access_token='access_token_from_ajax' 发送请求,并验证返回的 user_id 是否与我从 ajax 获得的 user_id 匹配。
    【解决方案2】:

    您可以检查用户是否拥有有效的访问令牌,换句话说,是否在某个时间点登录到您的网站。 FB 在前端为您提供会话数据,因此可以这样获取:

        FB.getLoginStatus(function(response){
            //send the response to the back end in a json string
        });
    

    然后在后端使用旧签名验证的修改版本对其进行验证。它接缝工作。如果我遗漏了什么,请告诉我。 它只告诉您用户 ID、访问令牌与您的站点匹配。不需要 curl 调用。 它不会告诉您会话当前是否实际有效,因此请不要依赖它来处理您的银行系统或其他任何事情。

    function validateFB_sessionObj($sessionObj){//pass me the session data object
       $sessionObj = $sessionObj->session;
       global $fb;//pull in the secret fb keys
       if (!is_object($sessionObj) || !isset($sessionObj->uid) || !isset($sessionObj->access_token) || !isset($sessionObj->sig)){
    //       warning("facebook session object is lacking something", $sessionObj);
           return false;
       }
       $expectedSig = generateSig($sessionObj, $secret);
       if ($sessionObj->sig = $expectedSig){
         //  status("fb signature looks good");
           return true;
       } else {
        //   warning("facebook signature looks wrong", $sessionObj);
           return false;
       }
    }
    
    function generateSig($params, $secret){
       $string = $params->access_token . $params->uid . $secret;
       return md5($string);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2013-08-21
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2012-05-01
      相关资源
      最近更新 更多