Facebook JavaScript SDK по HTTPS для загрузки незащищенных элементов

У меня есть приложение Facebook, в котором используется Facebook Connect.js.

Я запускаю свое приложение по HTTPS. Весь контент на сайте доставляется из https://, за исключением некоторого контента, который должен быть включен в Connect.js Facebook

Проблема в том, что я получаю предупреждающие сообщения о том, что на странице есть незащищенные элементы.

Я проверил, какие скрипты загружаются, используя вкладку Инструменты разработчика Chrome / Сеть, чтобы узнать, что файлы загружаются и откуда.

Единственное, что я вижу, загружается по HTTP, а не по HTTPS, - это файл с именем http://static.ak.facebook.com/connect/canvas_proxy.php.

Как я могу заставить этот файл использовать HTTPS?


person paperclip    schedule 06.03.2011    source источник
comment
Я бы уведомил Facebook об этой проблеме. Это определенно проблема, которую им необходимо решить, возможно, добавив оператор switch для проверки протокола.   -  person Jubair    schedule 16.03.2011


Ответы (8)


TL; DR

установите FB._https в true перед вызовом FB.init. Вот так:

FB._https = true;
FB.init({
    /* your app id and stuff */
});

Объяснение

Если вы уничтожите SDK JavaScript для Facebook, вы увидите, что это, по сути, литерал объекта с множеством свойств. Одно из этих свойств - _https, которое является логическим. Это свойство определяет, какой набор URL-адресов использовать (хранится в FB._domain) при выполнении запросов API. Кажется, что Facebook хранит два набора URL-адресов для каждого типа запроса API - безопасный URL-адрес и незащищенный URL-адрес, а затем использует функцию переключения под названием getDomain(), чтобы определить, какой из них использовать при выполнении запросов.

Причина, по которой SDK JavaScript вызывает предупреждения системы безопасности, связана со способом определения свойства FB._https. Вот как это в настоящее время определяется по состоянию на 24.08.2011:

_https: (window.name.indexOf('_fb_https') > -1)

Очевидно, Facebook считает, что если свойство window.name содержит _fb_https, то это должно быть безопасное приложение. Это явно неверно. Настоящий тест должен быть примерно таким:

_https: window.location.protocol == "https:"

К сожалению, SDK не является открытым исходным кодом и даже не имеет хорошей документации, поэтому я не могу отправить запрос на перенос этого изменения: P. В краткосрочной перспективе установка FB._https на true вручную перед вызовом FB.init должна помочь.

person Ralph Holzmann    schedule 24.08.2011
comment
+1, у нас это сработало. Хорошая находка. Наш офис отправил запрос на перенос в этот SDK, но он может или не может будь тем, кто сейчас в действии. - person Jimmy Sawczuk; 02.09.2011
comment
Из-за это (см. Ссылку) Я бы изменил FB._https = true; на FB._https = (window.location.protocol == "https:");, как сказал @ simon-bachler - person Alexandros B; 21.10.2011
comment
Я все еще вижу предупреждение только о безопасном содержимом в IE9 с моим приложением холста iframe. Пробовал использовать как FB._https = true; и FB._https = (window.location.protocol == https :); - person Ian; 23.10.2011
comment
@Ian вы загружаете фотографии профиля пользователя? если да, то делаете ли вы это через https? - person Alexandros B; 25.10.2011
comment
@Circadian Фотографии профиля поступают по https. Я думаю, проблема связана с передачей переменной GET с защищенной страницы холста (см. facebook.stackoverflow.com/questions/7866581/). Из-за этого я попытался перейти на метод ajax (см. facebook.stackoverflow.com/questions/7886324/). Если кто-нибудь может помочь мне отладить эту проблему, я НАСТОЯЩИЙ БЛИЖАЙШИЙ, чтобы быть в порядке. :-) - person Ian; 25.10.2011

Таким образом, вы получите ту же ссылку на протокол:

FB._https = (window.location.protocol == "https:");
person sbaechler    schedule 03.10.2011
comment
Доступ к частным методам станет устаревшим и будет удален 6 июня 2012 г .: developers.facebook.com/blog/post/2012/05/16/ Таким образом, это исправление больше не будет работать. Судя по всему, ошибка была исправлена ​​Facebook. - person sbaechler; 17.05.2012

Я столкнулся с этой проблемой несколько дней назад. Все мое приложение использовало HTTPS, и моя проблема заключалась в загрузке только изображений профиля через HTTP ... Мое быстрое и грязное решение заключалось в том, чтобы вручную заменить все доменные имена изображений профиля. Например,

str_replace('http://profile.ak.fbcdn.net','https://fbcdn-profile-a.akamaihd.net',$user['pic_square']);

Вам нужно будет проверить, какой URL-адрес есть у ваших изображений профиля. Я предполагаю, что они не из одного и того же места. Просмотрите URL-адрес вашего собственного изображения профиля и замените то, что есть у меня на https://fbcdn-profile-a.akamaihd.net.

После внимательного изучения документации Facebook:

Если вам нужно, чтобы изображение возвращалось через безопасное соединение, вы можете установить аргумент return_ssl_resources равным 1: https://graph.facebook.com/4/picture?return_ssl_resources=1.

Я нашел дополнительный параметр под названием return_ssl_resources, и при передаче с true он возвращает изображения профиля с использованием HTTPS.

$fql = "SELECT uid, name, pic_square FROM user WHERE uid=me()";

$param = array( 'method' => 'fql.query', 'query' => $fql, 'return_ssl_resources'=>1);

$fbuser = $facebook->api($param);

Это сработало как шарм, и я перестал получать смешанные предупреждения о безопасности. Надеюсь, это поможет!

person Lix    schedule 24.08.2011

Если добавить к Ральфу Хольцманну и Саймону Бэхлеру, следующее - еще более трудное решение, когда FB._ https сам по себе не помогает;

FB._https = (window.location.protocol == "https:");
FB.init({
    ...
});
if (FB._https && window == window.parent) {
    if (FB._domain && FB._domain.staticfb && FB._domain.https_staticfb)
        FB._domain.staticfb = FB._domain.https_staticfb;
}

См. Также FB.Arbiter.inform () {... FB.getDomain ((d? 'Https _': '') + 'staticfb', true) ...}, где d = window! = Window.parent && ... по состоянию на 10 февраля 2012 г.

person Carl Krig    schedule 10.02.2012

Похоже, что FB._https был заменен на:

FB._secure = (window.location.protocol == "https:");
person Stephane Brillant    schedule 09.07.2012

Похоже, это вызвано этой ошибкой Facebook.

См. Также это сообщение на форуме.

Эта ошибка была отмечена как устраненная 3/16, но я все еще наблюдаю не-https-запросы к canvas_proxy.php. Надеюсь, это скоро будет исправлено ...

person Mirko Froehlich    schedule 18.03.2011

Кстати, если у вас есть объявления типа документа на странице HTML, как показано ниже, ссылка на "http://www.w3.org" также может вызвать ошибку предупреждения о содержании в Internet Explorer.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
person Jim Jose    schedule 28.10.2011

У меня была аналогичная проблема (комментарии в fb не работают в безопасном режиме). Это решает проблему - просто обратитесь к файлу javascript через https:

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

Или не указывайте схему, которая будет работать для обоих:

<script type="text/javascript" src="//connect.facebook.net/en_US/all.js"></script>
person kraigh    schedule 20.09.2013