Facebook дает ошибку "Небезопасная ошибка JavaScript для доступа к фрейму с URL" в Chrome

Мое приложение для Facebook было отлично работает вчера в Chrome. Страница объединяет Silverlight ad Facebook через JavaScript SDK. Я могу проверить базовый статус входа, войти в Facebook, получить ваше имя и выйти из системы.

Сегодня, без изменений с моей стороны, в Chrome произошел сбой с ошибкой JavaScript, которая очень распространена в результатах поиска Google, но реальных ответов нет. Он по-прежнему отлично работает в IE и Firefox.

Здесь общедоступный URL:

http://www.andrewdothay.net/prj/facebook/

Когда вы открываете консоль JavaScript в Chrome, она бросает массу этих ошибок:


Небезопасная попытка JavaScript для доступа к кадру с URL-адресом

http://www.facebook.com/login.php?api_key=151352704876752&cancel_url=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df1175dd3f%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&channel_url=http%3A%2F%2Fwww.andrewdothay.net%2Fprj%2Ffacebook%2F&display=popup&fbconnect=1&locale=en_US&method=auth.login&next=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df3c546942%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&return_session=1&sdk=joey&session_version=3&v=1.0 из фрейма с URL http://www.andrewdothay.net/prj/facebook/.

Домены, протоколы и порты должны соответствовать.


Любые идеи о том, что происходит с Chrome здесь?


Обновление

Я обнаружил, что Chrome на сегодняшнем компьютере блокировал всплывающее имя входа, когда я вызывал FB.login(), но я знаю, что вчера не получал эти 190 сообщений об ошибках в консоли JavaScript.

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

Ответ 1

Я нашел решение. Если вы выполняете FB.login без действия пользователя, webkit блокирует всплывающие окна.

Например, я использовал систему приглашений в своем проекте. Для ввода кода приглашения был введен вход/текст. Я проверил, что код приглашения доступен с запросом ajax/post. если он доступен, я запускаю FB.login(). Как вы догадались, браузер заблокировал всплывающее окно и множество ошибок появилось на консоли js.

Итак, вы должны запустить FB.login() после действия пользователя. Я поставлю кнопку входа в facebook между ajax/post и FB.login(). Пользователям придется щелкнуть по нему - это отстойно, но они не заметят проблемы.

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

Ответ 2

В моем случае это из-за того, что facebook JS загружался несколько раз на одной странице: один для входа и второй для кнопки "как". Удаление ссылки в модуле "как" сохраняет день.

Ответ 3

Удаление опции "xfbml: true" из моего вызова FB.init исправлено для меня.

У меня возникла проблема в стандартном интернет-браузере на Android Jelly Bean

Ответ 4

Мюкахит Йылмаз прав. Возьмем пример, который я вставил ниже, и если вы используете метод setTimeout(), он терпит неудачу, другой разумно работает. Я до сих пор получаю предупреждающее сообщение в цикле, пока я не вхожу в систему, но это небольшая цена для оплаты. Я уверен, что пользователи этого не заметят.

$(document).ready(function() {
$("#facebook_link").click(function() {
    //setTimeout(fb);
    fb();
    return false;
});

function fb() {
    FB.getLoginStatus(function(response) {
        if (response.session) {
            // logged in and connected user, someone you know
            gotResponse(response);
        } else {
            // no user session available, someone you dont know
            FB.login(function(response) {
                if (response.session) {
                    // user successfully logged in
                    gotResponse(response);
                } else {
                    // user cancelled login, do nothing
                }
            });
        }
    });
}

function gotResponse(response) {
    console.dir(response);
}

});

Легко воспроизвести: войдите в facebook на другой вкладке, затем попробуйте этот код, и вы не увидите никаких предупреждений. Выйдите из системы, затем попробуйте код, и вы получите предупреждения. Это потому, что он попадает в блок .login.

Ответ 5

У меня была эта проблема с браузером Chrome, и это было связано с настройками хром. У меня установлен браузер, чтобы запретить сторонним сайтам устанавливать данные cookie. Разрешение всплывающих окон не было проблемой для меня. Когда создается facebook iFrame, он должен установить куки файл, который затем использует для отслеживания, если пользователь должен войти в систему. Если этот файл cookie не разрешен, то сайт выходит из строя. Одна вещь, которая была бы полезной в facebook api, была бы установкой, которая показывает, когда что-то не работает. Я не вижу это как событие, на которое можно подписаться и назначить обратный вызов.

Вот ссылка на sbk javascript FB на подписки. Любой ответ на поиск обратного вызова для неудавшихся запросов будет оценен. https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

Ответ 6

В моем случае проблема была связана с тегом <div id="fb-root"></div>. Я не размещал его сразу после открытия тега <body>, в соответствии с рекомендациями.

После помещения в нужное место ошибки "Небезопасный JavaScript..." остановился.

Ответ 7

И в моем случае проблема была связана с типом протокола: из:

<div class="fb-like-box" data-href="https://www.facebook.com/xxxxxx"

в

<div class="fb-like-box" data-href="http://www.facebook.com/xxxxxx"

поскольку мой веб-магазин не использовал https, я удалил 's' из атрибута data-href в подобном поле.

Ответ 8

Решение Mücahit Yılmaz тоже помогло мне. Мне не нужно было получать доступ к информации о пользователе, поэтому я удалил логин script из примера приложения. Также удалено сообщение приветствия и любая информация, требующая информации, хранящейся в переменной $basic.