Facebook Connect.js を使用するFacebookアプリケーションがあります。
アプリケーションをHTTPSで実行しています。サイトのすべてのコンテンツはhttps://
から配信されますが、FacebookのConnect.js
に含める必要がある一部のコンテンツは例外です
問題は、ページ内に安全でないアイテムがあるという警告メッセージが表示されることです。
Chrome の[開発者ツール]/[ネットワーク]タブを使用して、どのスクリプトがロードされているかを確認し、どのファイルがどこからロードされているかを確認しました。
HTTPS経由ではなくHTTP経由でロードされていることがわかるのは、http://static.ak.facebook.com/connect/canvas_proxy.php
というファイルだけです。
このファイルでHTTPSを使用するにはどうすればよいですか?
TL; DR
_FB._https
_を呼び出す前に、_FB.init
_をtrue
に設定します。そのようです:
_FB._https = true;
FB.init({
/* your app id and stuff */
});
_
説明
Facebook JavaScript SDKをunminifyすると、基本的には一連のプロパティを持つオブジェクトリテラルが表示されます。これらのプロパティの1つは__https
_であり、これはブール値です。このプロパティは、APIリクエストを行うときに使用するURLのセット(_FB._domain
_に格納)を決定します。 FacebookがAPIリクエストのタイプごとに2セットのURL(セキュア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
_を呼び出す前に__FB.init
_を手動でtrue
に設定すると、うまくいくはずです。
だからこれはあなたに同じプロトコルリンクを与えるでしょう:
FB._https = (window.location.protocol == "https:");
数日前にこの問題に遭遇しました。私のアプリケーション全体が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);
それは魅力のように機能し、混合セキュリティ警告を受け取るのをやめました。これが役に立てば幸いです!
Ralph HolzmannとSimonBächlerに加えて、以下は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年2月10日現在。
FB._httpsに置き換えられたように見えます:
FB._secure = (window.location.protocol == "https:");
私は同様の問題を抱えていました(fbコメントがセキュアモードで機能していません)。これはそれを解決します-https経由でjavascriptファイルを参照するだけです:
<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>
これは Facebookバグ が原因であるようです。
こちらもご覧ください フォーラム投稿 。
そのバグは3/16に解決済みとしてマークされましたが、まだcanvas_proxy.phpへの非httpsリクエストを監視しています。うまくいけば、これはすぐに実際に修正されるでしょう...
補足として、次のように [〜#〜] html [〜#〜] ページにdoc-type宣言がある場合、「 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">