1

这个问题一开始可能听起来有点沉闷,我自己也很困惑。我正在开发一个严重依赖 Facebook API 的 PHP 应用程序,因此使用 PHP SDK 连接并通过以下方式获取当前登录的用户

$fb->getUser();

我还包括了 Javascript SDK,但它目前只获取登录用户并将他们的数据对象打印到控制台。

今天我开始实现该应用程序的本地开发版本,在 Facebook 上设置了第二个开发应用程序,将它们连接起来,瞧……它不起作用。getUser() 在本地总是为我返回 0。我刚刚发现它可以在 Firefox 中运行。我 var_dump getUser() 值,并在 Firefox 中收到完整的用户 ID(我的),但在 Chrome 中为 0(是的,我在两个浏览器上都登录了 Facebook)。

我清除了缓存、cookies、销毁了会话。我只是无法想象浏览器对 Facebook 的 PHP 请求有什么不同?有没有人经历过这样的事情?显然 app_key 和 secret 必须正确,因为它适用于 Firefox。


编辑:仅供参考,应用程序的实时版本(托管)在 Chrome 中运行良好,只有这个非常本地的应用程序我无法工作。


编辑#2:这是我在应用程序上运行的 Javascript

  <div id="fb-root"></div>
  <script>
    window.fbAsyncInit = function() {
      FB.init({
        appId      : {$_connect.app_id}, // App ID
        channelUrl : '{$_connect.channel_file}', // Channel File
        status     : true, // check login status
        cookie     : true, // enable cookies to allow the server to access the session
        xfbml      : true  // parse XFBML
      });
    {if !$_user.is_authorized}
    // listen for and handle auth.statusChange events
    FB.Event.subscribe('auth.statusChange', function(response) {
      if (response.authResponse) {
        // user has auth'd your app and is logged into Facebook
        FB.api('/me', function(me){
          if (me.name) {
            console.log(me);
            //window.location = 'index.php';
            // redirection is currently causing loop
          }
        })
      } else {}
    });
    {/if}
    };
    // Load the SDK Asynchronously
    (function(d){
       var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
       if (d.getElementById(id)) {return;}
       js = d.createElement('script'); js.id = id; js.async = true;
       js.src = "//connect.facebook.net/de_DE/all.js";
       ref.parentNode.insertBefore(js, ref);
     }(document));
  </script>
4

2 回答 2

1

我只是无法想象浏览器对 Facebook 的 PHP 请求有什么不同?

当然,唯一的可能是参数。

在这种情况下,很可能是 cookie——Facebook 在成功登录时设置的 cookie,浏览器必须接受并发送回服务器,以便 PHP SDK 能够识别登录的用户。

因此,当您在本地测试您的应用程序时,请检查您的 Chrome 是否接受这些 cookie。

于 2012-09-14T12:10:28.407 回答
1

我认为,您还需要在两个浏览器中通过 JS SDK 进行身份验证,我相信 JavaScript 请求背后有一些 OAuth 逻辑。

然而,现在的 Chrome 试图阻止或干脆不执行跨域 js 请求。如果您遇到类似的情况,请尝试查看网络控制台。如果确实如此

  • 尝试检查本地环境的域 + 协议 /http(s)/。我相信你应该在调用 js api 时使用 https
  • 考虑使用通道文件,它应该可以解决/防止这些跨浏览器调用问题,如JavaScript SDK 文档中所述

如果上面没有任何帮助您,我想您可以开发应用程序,在 FFox 上对其进行测试,然后在部署后使用真实设置对其进行测试。

祝你好运。

于 2012-09-14T14:00:55.263 回答