Диалог FB.login не закрывается в Google Chrome - PullRequest
40 голосов
/ 25 мая 2011

Я звоню FB.login() по событию клика в моем приложении.Диалог всплывает, как и ожидалось, но когда пользователь завершает вход в Facebook (и / или авторизует приложение), диалог не закрывается.Вместо этого он загружает белую страницу (внутри диалогового окна) и название меняется на XD Proxy .

Это происходит только в Google Chrome (я использую самую последнюю версию, доступную сейчас для Windows7).

Этого не происходит, если Chrome находится в режиме инкогнито.

Социальный плагин fb-login отлично работает в Chrome.

Для дальнейшего тестирования / отладки,Я создал новое приложение Facebook с настройками ванили.Единственное изменение, которое я сделал, было установить URL сайта в настройках приложения.Вот HTML-код, который можно использовать для воссоздания этой ошибки.

Пример кода для воссоздания проблемы

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Chrome Bug Test</title>
    </head>
    <body>
        <button onclick="dologin()">Login using Facebook</button>

        <div id="fb-root"></div>
        <script src="http://connect.facebook.net/en_US/all.js"></script>
        <script>
          FB.init({
            appId  : '[YOUR APP ID HERE]',
            status : true, // check login status
            cookie : true, // enable cookies to allow the server to access the session
            xfbml  : true  // parse XFBML
          });
        </script>

        <script type="text/javascript">
            function dologin(){
                FB.login(function(r){
                    if(console && console.log) {
                        console.log(r);
                    }
                });
            }
        </script>

    </body>
</html>

Настройки Facebook, которые я пытался изменить

  1. Настройкадомен сайта, ничего не изменивший.
  2. Использование настраиваемого channelUrl и файла канала тоже не помогло.

Связанные ошибки, отслеживаемые на Facebook

Проблемы, связанные с переполнением стека

Я видел, что многие сталкивались с этим, но меня беспокоит то, что я не смог найти конкретное решение для этого.Facebook еще не ответил на сообщения об ошибках.Одним из решений было бы избавиться от кода аутентификации на основе Javascript и сделать это исключительно с помощью серверного механизма (Facebook PHP SDK).Я хотел бы избежать этого из-за нехватки времени.

У кого-нибудь есть идеи, как это исправить?

Ответы [ 6 ]

11 голосов
/ 17 апреля 2012

Я получил аналогичный вызов FB.login(), чтобы закрыть диалоговое окно, изменив

onclick="dologin()"

на

onclick="dologin(); return false;"
7 голосов
/ 20 июля 2013

Учитывая возраст этого поста, я предполагаю, что постер решил это;однако, учитывая, что это также ресурс для других, ищущих решение подобных проблем, я подумал, что я бы включил свой опыт на всякий случай.я случайно забыл включить event.preventDefault(); в обработчик прослушивания "click" в jQuery.Диалог входа в Facebook появлялся и позволял мне войти, но не исчезал.Проблема заключалась в том, что веб-сайт выполнял действие публикации формы по умолчанию, которое мешало функции обратного вызова Facebook.

6 голосов
/ 08 июля 2011

У меня была точно такая же проблема.Я сделал две вещи, сначала я добавил эту строку прямо перед вызовом FB.init():

FB.Flash.hasMinVersion = function () { return false; };

Затем я зашел на страницу приложения FB и добавил домен сайта (то есть test.com).

Я думаю, что настройка домена сайта была ключевой, но я не на 100% уверен.Все, что я знаю, это то, что теперь он всегда закрывается во всех браузерах, включая Chrome.

5 голосов
/ 10 апреля 2012

Краткий ответ на вопрос, указанный выше:

Загрузите скрипт all.js вместо https.

<script src="https://connect.facebook.net/en_US/all.js"></script>

Более длинный ответ, если выУстранение проблемы, аналогичной исходному вопросу:

Используйте Google Chrome, чтобы попытаться войти в систему.После входа в систему и появления на экране пустого всплывающего окна нажмите F12 .Это поднимает инструменты разработчика для Chrome.Перейдите на вкладку «Консоль», и вы увидите ошибку.То, что вы, скорее всего, увидите, связано с проблемами XD (междоменных).

Даже если ваша конкретная проблема отличается от проблемы, с которой я столкнулся, вышеприведенное должно привести вас в правильном направлении.1019 * Моя проблема / решение были специфическими для документации Facebook C # SDK v6 - учебный код загружает скрипт all.js , используя URL, начинающийся с // - который затем загружает скрипт по той же схеме, что и мой сайт (который был http).После того, как я вошел в систему, всплывающее окно попыталось перенаправить меня обратно с учетной записи https Facebook на мой http-сайт и бинго, у нас возникла проблема XD.Решением было специально загрузить скрипты из https://connect.facebook.net/en_US/all.js следующим образом:

  // 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 = "https://connect.facebook.net/en_US/all.js";
     ref.parentNode.insertBefore(js, ref);
   }(document));

Редактировать:

После некоторого рассмотрения этот подходразрешение перенаправления на http может поставить под угрозу безопасность системы, поскольку данные в этом запросе могут быть прочитаны кем-то другим, а затем использованы повторно.Я не мог найти соответствующую документацию или примеры, и поэтому я не мог заключить так или иначе, YMMV.

2 голосов
/ 15 декабря 2011

Вызов этого фрагмента после FB.init исправил проблему для меня.Но другие решения, похоже, сработали для других случаев.

$.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase());
if ($.browser.chrome || $.browser.msie) {
    FB.XD._origin = window.location.protocol + "//" + document.domain + "/" + FB.guid();
    FB.XD.Flash.init();
    FB.XD._transport = "flash";
  } else if ($.browser.opera) {
    FB.XD._transport = "fragment";
    FB.XD.Fragment._channelUrl = window.location.protocol + "//" + window.location.host + "/";
  }
1 голос
/ 28 февраля 2012

Я столкнулся с той же проблемой в IE9, и, похоже, она возникла в результате обновления до Flash Player 10. Предлагаемые ответы уже не сработали, и я потерял надежду, пытаясь ее исправить, так как нашел открыть ошибку на Facebook , покрывающую ее. Но Хенсон опубликовал ответ на аналогичный вопрос , который исправил его для меня. В JavaScript в мастере моего сайта я удалил эти строки

    FB.UIServer.setLoadedNode = function (a, b) {
       //HACK: http://bugs.developers.facebook.net/show_bug.cgi?id=20168
        FB.UIServer._loadedNodes[a.id] = b;
    };

и теперь это работает. (N.B. Я не проверял, были ли проблемы с IE8 теми строками, предназначенными для преодоления возвратов.)

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