Ошибки междоменного скриптинга только для Chrome в приложении Facebook iFrame при входе через FB.(..)

В Google Chrome (у меня 9.0.597.98) мое приложение Facebook iFrame с использованием Graph API/Javascript SDK всегда выдает следующие две ошибки JavaScript (см. ниже) на основе междоменных сценариев, но только на одной странице приложения.

Он входит в бесконечный цикл повторных попыток во втором сообщении. После того, как он оставил его на ночь, сегодня утром он сообщил о полумиллионе повторных попыток!

Вызов 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 Единственное другое различие, которое я вижу между этими двумя сообщениями, заключается в том, что аргумент запроса postmessage имеет различное значение для каждого (выделено жирным шрифтом в сообщениях). ). Однако существует только один iFrame, который представляет собой приложение Facebook, поэтому мне интересно, почему два разных значения могут использоваться одно за другим. Я не хочу, чтобы ответы были сосредоточены на этом пункте, но я хотел указать на это.

Приветствуются предложения по устранению этих ошибок.

Сообщения консоли Chrome JavaScript:

Сообщение 1: попытка небезопасного JavaScript получить доступ к фрейму с URL-адресом

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 из кадра с URL-адресом http://subdomain.example.com/colonversationmap/Admin.TestPage.aspx?Signed_request=871miFgH_-o05POnx20387XHd2YlArKLU6qUv8VkxY4.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTI5ODQyMDEwMSwidXNlciI6eyJjb3VudHJ5IjoiY2EiLCJsb2NhbGUiOiJlbl9VUyIsImFnZSI6eyJtaW4iOjIxfX19. Домены, протоколы и порты должны совпадать.

Сообщение 2: попытка небезопасного JavaScript получить доступ к фрейму с URL-адресом

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 из фрейма с URL-адресом http://subdomain.example.com/colonversationmap/Admin.TestPage.aspx?signed_request=871miFgH_-o05POnx20387XHd2YlArKLU6qUv8VkxY4.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTI5ODQyMDEwMSwidXNlciI6eyJjb3VudHJ5IjoiY2EiLCJsb2NhbGUiOiJlbl9VUyIsImFnZSI6eyJtaW4iOjIxfX19. Домены, протоколы и порты должны совпадать.


person John K    schedule 23.02.2011    source источник
comment
Нашел это: anantgarg.com/2010/02/18/ междоменные файлы cookie в Safari   -  person Intelekshual    schedule 23.02.2011
comment
@Intelekshua Спасибо за полезную информацию. Я добавил его в закладки для справки.   -  person John K    schedule 24.02.2011
comment
Это то, что вы получаете, когда классный сторонний API (Facebook) представляет собой черный ящик.   -  person Christian    schedule 23.01.2012


Ответы (4)


Я также столкнулся с проблемой, из-за которой функция getLoginStatus() не вызывалась в Chrome. Я пытался вызвать его при загрузке страницы и после действия, инициированного пользователем, но безуспешно.

Оказалось, что это не междоменная проблема. Вызов был заблокирован расширением Un-Passwordise в Chrome. Как только я отключил расширение, оно отлично заработало даже при загрузке страницы.

Подробнее об этой проблеме здесь: FB.getLoginStatus никогда не запускает функцию обратного вызова в JavaScript SDK Facebook

person bluehazetech    schedule 22.01.2012
comment
Спасибо за примечание, что это может быть расширение. +1 - person John K; 23.01.2012

В моем случае оказалось, что Chrome жаловался всякий раз, когда я вызывал метод FB.login(..) Facebook JavaScript API сразу после загрузки страницы или DOM.

Чтобы обойти эту проблему в Chrome, я поместил на страницу кнопку, которую пользователь должен нажать, чтобы запустить сценарий входа. Это работает в Chrome. Это обходной путь, но на данный момент мне достаточно.

примечание. Для вторичной страницы, о которой я упомянул в своем вопросе, которая работает, она уже настроена для инициируемого пользователем запроса на вход.

person John K    schedule 23.02.2011

Добавление файла канала может решить эту проблему. См. документацию Facebook Javascript API: https://developers.facebook.com/docs/reference/javascript/

person Abe    schedule 24.12.2011

У меня была эта проблема на моем сайте, но оказалось, что я использую старую версию FB.login.

Со страницы Facebook FB.login:

По состоянию на 13 декабря 2011 г. пакет SDK для JavaScript теперь поддерживает только OAuth 2.0 для аутентификации. Возможность включить OAuth 2.0 в JS SDK впервые появилась в июле. Все приложения были предоставлены до 1 октября 2011 г. для тестирования и переноса. С этим изменением убедитесь, что вы заменили response.session на response.authResponse. Чтобы запросить разрешения, вы должны использовать scope вместо perms. Подробнее о конкретных изменениях читайте здесь.

person Jhony Fung    schedule 23.01.2012
comment
Вам должно понравиться, как Facebook просто меняет то, как все работает! У меня тоже была эта проблема в некоторых моих старых приложениях. Из-за этого я потерял еще час или около того. - person Paul Johnson; 17.02.2012