Подтвердить что ты не робот

Диалог FB.login не закрывается в Google Chrome

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

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

Это не происходит, если 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, которые я пытался изменить

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

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

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

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

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

4b9b3361

Ответ 1

Вызов этого фрагмента после 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 + "/";
  }

Ответ 2

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

onclick="dologin()"

к

onclick="dologin(); return false;"

Ответ 3

Учитывая возраст этого поста, я предполагаю, что плакат решил это; однако, учитывая, что это также ресурс для других, ищущих решение подобных проблем, я думал, что буду включать мой опыт на всякий случай.

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

Ответ 4

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

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

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

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

Ответ 5

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

Загрузите all.js script поверх https.

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

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

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

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

Моя проблема/решение было специфическим для документации Facebook С# SDK v6 - код учебника загружает all.js script, используя URL-адрес, начинающийся с //, который затем загружает script по той же схеме, что и мой сайт (который был http). После того, как я вошел в систему, всплывающее окно попыталось перенаправить меня обратно с входа в https Facebook на мой сайт http и bingo, у нас есть проблема с 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));

Edit:

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

Ответ 6

Я испытываю ту же проблему в IE9, и, похоже, это связано с обновлением до Flash Player 10. Ответы, предложенные мной, уже не работали для меня, и я потерял надежду на то, чтобы исправить это, a href= "http://bugs.developers.facebook.net/show_bug.cgi?id=12112" rel= "nofollow noreferrer" > открыть ошибку в Facebook. Но Henson отправил ответ на аналогичный вопрос, который исправил его для меня. В 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 выдавал эти строки для преодоления возвратов.)