FB.Login(..)上的Facebook iFrame App中仅限Chrome的跨域脚本编写错误

时间:2011-02-23 16:31:39

标签: javascript google-chrome facebook-iframe facebook-javascript-sdk

在谷歌浏览器(我在9.0.597.98)中,使用Graph API / Javascript SDK的我的Facebook iFrame应用程序往往会基于跨域域抛出以下两个JavaScript错误(见下文)脚本,但只在应用程序的一个页面上。

它进入第二条消息的无限重试循环。离开之后,它在今天早上报告了50万次重试!

正在使用的FB呼叫用于登录:

FB.login(function(response) {
  if (response.session) {
    // user successfully logged in
  } else {
    // user cancelled login
  }
});

在Firefox和IE9中,我没有收到这些错误。它特定于Chrome(可能是WebKit)。 奇怪的是,除了其他浏览器之外,我在应用中的第二页使用FB.Login并且在Chrome中运行。 我在某处读到Safari对跨域脚本编写有更严格的要求 - 它与Chrome共享相同的代码库。

Domains, protocols and ports must match(错误消息)我认为实际上是满意的,因为我有另一个页面适用于FB.Login调用我在这两个消息之间看到的唯一区别是{{1查询参数对于每个都有不同的值(在消息中加粗)。然而,只有一个iFrame构成了一个Facebook应用程序,所以我想知道为什么两个不同的值可能会一个接一个地使用。我不是故意引导回答专注于这个项目,但我确实想指出它。

欢迎建议我尝试解决此错误。

Chrome JavaScript控制台消息:

消息1 :不安全的JavaScript尝试使用网址访问框架

https://www.facebook.com/dialog/permissions.request?api_key=168297653202478&app_id=168297653202478&display=popup&fbconnect=0&locale=en_US&method=permissions.request&next=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df3d15633dc%26origin%3Dhttp%253A%252F%252Fsubdomain.example.com%252Ff22a8befa%26relation%3Dopener%26transport%3D postmessage %26frame%3D f111baf6f4 %26result%3D%2522xxRESULTTOKENxx%2522& perms = publish_stream%2Coffline_access& return_session = 1& sdk = joey& ; session_version = 3,来自带有网址http://subdomain.example.com/colonversationmap/Admin.TestPage.aspx?signed_request=871miFgH_-o05POnx20387XHd2YlArKLU6qUv8VkxY4.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTI5ODQyMDEwMSwidXNlciI6eyJjb3VudHJ5IjoiY2EiLCJsb2NhbGUiOiJlbl9VUyIsImFnZSI6eyJtaW4iOjIxfX19的框架。域,协议和端口必须匹配。

消息2 :不安全的JavaScript尝试使用网址访问框架

https://www.facebook.com/dialog/permissions.request?api_key=168297653202478&app_id=168297653202478&display=popup&fbconnect=0&locale=en_US&method=permissions.request&next=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df304d46e08%26origin%3Dhttp%253A%252F%252Fsubdomain.example.com%252Ff23ce8203%26relation%3Dopener%26transport%3D postmessage %26frame%3D fcd3637bc %26result%3D%2522xxRESULTTOKENxx%2522& perms = publish_stream%2Coffline_access& return_session = 1& sdk = joey& ; session_version = 3,来自带有网址http://subdomain.example.com/colonversationmap/Admin.TestPage.aspx?signed_request=871miFgH_-o05POnx20387XHd2YlArKLU6qUv8VkxY4.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTI5ODQyMDEwMSwidXNlciI6eyJjb3VudHJ5IjoiY2EiLCJsb2NhbGUiOiJlbl9VUyIsImFnZSI6eyJtaW4iOjIxfX19的框架。域,协议和端口必须匹配。

4 个答案:

答案 0 :(得分:3)

我还遇到了一个问题,即Chrome中没有调用 getLoginStatus()。我尝试在页面加载时调用它,并在用户启动的操作之后没有成功。

原来,这不是一个跨域问题。 Chrome中的取消密码扩展程序阻止了该来电。一旦我禁用了扩展程序,即使在页面加载时它也能正常工作。

有关此问题的更多信息,请访问:FB.getLoginStatus never fires the callback function in Facebook's JavaScript SDK

答案 1 :(得分:2)

就我而言,事实证明,只要我在Page或DOM加载时立即调用Facebook JavaScript API的FB.login(..)方法,Chrome就会抱怨。

为了解决Chrome中的这个问题,我在页面上放了一个按钮,用户必须单击该按钮才能启动登录脚本。这适用于Chrome。这是一个解决方法,但对我来说已经足够了。

注意:对于我在我的问题中提到的辅助页面,它已经设置为用户启动的登录提示。

答案 2 :(得分:2)

添加频道文件可能有助于解决此问题。查看Facebook Javascript API文档: https://developers.facebook.com/docs/reference/javascript/

答案 3 :(得分:2)

我在我的网站上遇到此问题,但事实证明我使用的是旧版FB.login。

来自Facebook FB.login页面:

截至2011年12月13日,JavaScript SDK现在仅支持OAuth 2.0进行身份验证。在JS SDK中启用OAuth 2.0的能力于7月首次推出。所有应用程序都将在2011年10月1日之前进行测试和迁移。通过此更改,请确保您已将response.session替换为response.authResponse。要申请权限,您必须使用scope代替perms。点击此处了解有关具体更改的更多信息。