Facebook JavaScript SDK через HTTPS, загрузка незащищенных элементов
У меня есть приложение для Facebook, которое использует Facebook Connect.js.
Я запускаю приложение поверх HTTPS. Весь контент на сайте поставляется с https://
, за исключением некоторого контента, который должен быть включен в Facebook Connect.js
Проблема в том, что я получаю предупреждающие сообщения о том, что на странице есть незащищенные элементы.
Я проверил, какие скрипты загружаются с помощью Chrome вкладки "Инструменты разработчика" / "Сеть", чтобы узнать, какие файлы загружаются и откуда.
Единственный, который я вижу, который загружается через HTTP, а не через HTTPS - это файл с именем http://static.ak.facebook.com/connect/canvas_proxy.php
.
Как заставить этот файл использовать HTTPS?
Ответы
Ответ 1
TL; DR
установите FB._https
в true
перед вызовом FB.init
. Например:
FB._https = true;
FB.init({
/* your app id and stuff */
});
Объяснение
Если вы разобщите SDK для Facebook, вы увидите, что это в основном объектный литерал с кучей свойств. Одно из этих свойств - _https
, которое является булевым. Это свойство определяет, какой набор URL-адресов использовать (хранится в FB._domain
) при выполнении запросов API. Кажется, что Facebook поддерживает два набора URL-адресов для каждого типа запросов API - защищенного URL-адреса и небезопасного 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
должна выполнить трюк.
Ответ 2
Итак, это даст вам одну и ту же ссылку протокола:
FB._https = (window.location.protocol == "https:");
Ответ 3
Я столкнулся с этой проблемой несколько дней назад. Все мое приложение использовало 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);
Он работал как шарм, и я прекратил получать смешанные предупреждения о безопасности. Надеюсь, это поможет!
Ответ 4
Добавляя к Ральфу Хольцману и Симону Бэхлеру, это еще более трудное решение, когда 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 & &... с 2012 по февраль. 10.
Ответ 5
Он выглядит как FB._https как замененный на:
FB._secure = (window.location.protocol == "https:");
Ответ 6
Это, по-видимому, вызвано этой ошибкой Facebook.
Также см. этот форум.
Эта ошибка была отмечена как разрешенная 3/16, но я все еще наблюдаю запросы без https для canvas_proxy.php. Надеюсь, это скоро будет исправлено...
Ответ 7
В боковом объявлении, если у вас есть объявления типа документа на странице 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">
Ответ 8
У меня была аналогичная проблема (комментарии 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>