43 votes

Facebook JavaScript SDK sur HTTPS chargement d'éléments non sécurisés

J'ai un Facebook application qui utilise le Facebook Connect.js.

Je suis en cours d'exécution de mon application via le protocole HTTPS. Tous les contenus sur le site sont livrés à partir d' https:// , à l'exception de certains éléments de contenu qui doit être inclus dans Facebook de l' Connect.js

Le problème est que j'obtiens des messages d'avertissement disant qu'il y a des éléments non sécurisés à l'intérieur de la page.

J'ai vérifié ce que les scripts sont chargés à l'aide de Chrome's Outils de développement / onglet Réseau pour voir quels sont les fichiers en cours de chargement et d'où.

Le seul que je peux voir qui est en cours de chargement sur HTTP et non HTTPS est un fichier appelé http://static.ak.facebook.com/connect/canvas_proxy.php.

Comment puis-je la force de ce fichier pour utiliser le protocole HTTPS?

54voto

Ralph Holzmann Points 576

TL;DR

ensemble FB._https de true avant d'appeler FB.init. Comme suit:

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

Explication

Si vous unminify le Facebook SDK JavaScript, vous verrez que c'est en fait un objet littéral avec un tas de propriétés. L'une de ces propriétés est - _https, ce qui est un booléen. Cette propriété détermine l'ensemble des Url à utiliser (stocké dans FB._domain) lors de la prise de requêtes à l'API. Il semble que Facebook conserve deux ensembles d'Url pour chaque type de demande d'API -- une URL sécurisée et non-sécurisé URL-alors utilise un commutateur fonction appelée getDomain() pour déterminer à utiliser lors de la formulation de requêtes.

La raison pour laquelle le SDK JavaScript causes des avertissements de sécurité est due à la façon dont l' FB._https propriété est définie. C'est de cette façon qu'elle est définie actuellement que de 2011-8-24:

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

Apparemment Facebook pense que si l' window.name propriété a _fb_https , alors il doit être sûr app. C'est évidemment incorrect. Le véritable test doit être quelque chose de similaire à ceci:

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

Malheureusement, le SDK n'est pas open source ou même bien documenté, donc je ne peux pas soumettre une demande d'extraction de ce changement :P. Dans le court terme,le paramètre FB._https de true manuellement avant d'appeler FB.init devrait faire l'affaire.

9voto

sbaechler Points 485

Donc, cela vous donnerait le même lien de protocole:

 FB._https = (window.location.protocol == "https:");
 

8voto

Lix Points 27516

Je suis tombé sur ce problème il y a quelques jours. Mon ensemble de l'application est l'utilisation de HTTPS et ma question était seulement de photos de profil en cours de chargement sur HTTP... Mon rapide et sale solution était de remplacer manuellement toutes les images de profil des noms de domaine. Par exemple,

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

Vous devrez vérifier et voir ce que l'URL de votre profil, photos et. Je suppose qu'ils ne viennent pas exactement au même endroit. Afficher l'URL de votre propre photo de profil et de le remplacer par ce que j'ai à l' https://fbcdn-profile-a.akamaihd.net.

Après avoir regardé de plus difficile sur le Facebook de la documentation:

Si vous avez besoin d'une image pour être renvoyé sur une connexion sécurisée, vous pouvez définir la return_ssl_resources argument 1: https://graph.facebook.com/4/picture?return_ssl_resources=1.

J'ai trouvé un paramètre supplémentaire appelé return_ssl_resources, et lorsqu'il est passé avec true, il renvoie les images de profil à l'aide de 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);

Il a travaillé comme un charme, et j'ai arrêté d'obtenir le mélange des avertissements de sécurité. J'espère que cela aide!

2voto

Carl Krig Points 131

Pour ajouter à Ralph Holzmann et Simon Bächler, ce qui suit est un correctif encore plus frappant lorsque FB._ https ne suffit pas;

 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;
}
 

Voir aussi FB.Arbiter.inform () {... FB.getDomain ((d? 'Https _': '') + 'staticfb', true) ...} où d = window! = Window.parent && ... à partir de 2012-février-10.

1voto

Il semble que FB._https ait été remplacé par:

 FB._secure = (window.location.protocol == "https:");
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: