这个问题一开始听起来可能有点枯燥,我自己也很困惑。。我正在开发一个严重依赖于Facebook API的PHP应用程序,因此使用PHP SDK连接并通过获取当前登录的用户
$fb->getUser();
我还包含了Javascript SDK,但它目前只获取登录用户并将他们的数据对象打印到控制台。
今天,我开始实现该应用程序的本地开发版本,在Facebook上建立了第二个开发应用程序,并将它们连接起来。。它不起作用。getUser()在本地总是为我返回0。不过,我刚刚发现它在Firefox中有效。我var_dump getUser()值,在Firefox中收到一个完整的用户id(我的),但在Chrome中收到0(是的,我在两种浏览器上都登录了Facebook)。
我清除了缓存,cookie,破坏了会话。。我简直无法想象浏览器对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>
我简直无法想象浏览器对Facebook的PHP请求有什么不同?
当然,唯一的可能是参数。
在这种情况下,Facebook在成功登录时设置的cookie很可能是cookie,浏览器必须接受并发送回服务器,PHP SDK才能识别登录的用户。
因此,当您在本地测试应用程序时,请检查您的Chrome是否接受这些cookie。
我认为,您还需要在两种浏览器中通过JS SDK进行身份验证,我相信JavaScript请求背后有一些OAuth逻辑。
然而,Chrome现在试图阻止或根本不执行跨域js请求。如果发生类似的事情,请尝试查看网络控制台。如果是
- 请尝试检查本地环境的域+协议/http(s)/。我认为在调用js-api时应该使用https
- 考虑使用通道文件,它应该解决/防止JavaScript SDK文档中描述的这些跨浏览器调用问题
如果上面没有任何帮助,我想你可以开发这个应用程序,在FFox上测试它,然后在部署后用实际设置测试它。
祝你好运。