Facebook JavaScript SDK через HTTPS загрузка незащищенных элементов - PullRequest
43 голосов
/ 06 марта 2011

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

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

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

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

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

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

Ответы [ 8 ]

54 голосов
/ 25 августа 2011

TL; DR

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

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

Пояснение

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

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

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

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

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

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

9 голосов
/ 03 октября 2011

Так что это даст вам ту же ссылку протокола:

FB._https = (window.location.protocol == "https:");
8 голосов
/ 24 августа 2011

Я столкнулся с этой проблемой несколько дней назад.Все мое приложение использовало 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);

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

2 голосов
/ 10 февраля 2012

Если добавить к Ральфу Хольцману и Саймону Бехлеру, следующее исправление еще сложнее, когда 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 февраля.

1 голос
/ 10 июля 2012

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

FB._secure = (window.location.protocol == "https:");
0 голосов
/ 20 сентября 2013

У меня была похожая проблема (комментарии 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>
0 голосов
/ 28 октября 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">
0 голосов
/ 19 марта 2011

Кажется, это вызвано этой ошибкой Facebook .

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

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

...