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

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?

4b9b3361

Ответ 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>