Facebook PHP SDK と Facebook JS SDK を使用して、Web アプリで認証を管理しています。フローは次のようになります: FB ログイン ボタンをクリック -> OAuth ダイアログを起動 -> アカウントの詳細を OAuth ダイアログに入力 -> OAuth ダイアログが閉じ、Web ページがリロードされます (認証されたユーザーのコンテンツが表示されます)。すべてかなり標準的だと思います。
私はもともと auth.login と auth.logout を購読していましたが、これは Firefox では完全に機能しましたが、IE 10 では OAuth ダイアログの後にリロードしませんでした。認証されたユーザーとしてサイトを表示するには、手動でリロードする必要がありました。アラートを使用したテスト (および SO に関する他の質問を読む) から、Facebook の auth.login イベントは IE 10 ではまったく発生しないようです (ただし、auth.logout は正常に機能しました)。そこで、auth.authResponseChange イベントのサブスクライブに切り替えたところ、Firefox と IE 10 の両方で適切にリロードされるようになりました。
ただし、IE 9 でも同じ問題が発生しています。OAuth を閉じた後にリロードされません。auth.authResponseChange イベントは認識されますが、IE 9 では、ページを手動でリロードするまで発生しないようです。明らかに、IE 9 を削除したいと思っているのと同じように、IE 9 は広く使用されているため、IE 9 のサポートはオプションではなく、ログイン後に手動でリロードする必要があることは受け入れられません。
私のコードは、他のブラウザーでも適切に動作し、auth.authResponseChange イベントによってトリガーされたコードは、イベントがトリガーされると IE 9 でも正しく実行されるため、優れていると思います。手動リロード後までトリガーされません。それでも、参照用の私のFB初期化コードは次のとおりです。
<!-- START FACEBOOK CONNECT -->
<div id="fb-root"></div>
<script>
function setCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}
function clearCookie(name) {
setCookie(name,"",-1);
}
// Main init code
window.fbAsyncInit = function() {
FB.init({
appId : '<?=$vt->conf->fb->appID?>',
channelUrl : '//<?=$vt->conf->domain?>/fb_channel.html',
status : true,
cookie : true,
xfbml : true
});
// Additional init code here
<?php if ($page->vt->auth->usingFacebook) { ?>
FB.Event.subscribe('auth.authResponseChange', function(response) {
if (response.status != 'connected') {
// User has been logged out
//console.log('FB: logout');
alert('FB logout');
clearCookie('vt_fbat');
window.location.reload(true);
}
});
<?php } else { ?>
FB.Event.subscribe('auth.authResponseChange', function(response) {
if (response.status == 'connected') {
// User has been logged in
//console.log('FB: login');
alert('FB login');
setCookie('vt_fbat',response.authResponse.accessToken);
window.location.reload(true);
}
});
<?php } ?>
//
//
//FB.Event.subscribe('auth.authResponseChange', function(response) {
// alert('FB: login');
// console.log('FB: login');
// console.dir(response);
// setCookie('vt_fbat',response.authResponse.accessToken);
// window.location.reload(true);
//});
//FB.Event.subscribe('auth.logout', function(response) {
// console.log('FB: logout');
// clearCookie('vt_fbat');
// window.location.reload(true);
//});
};
// Load the SDK Asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
</script>
<!-- END FACEBOOK CONNECT -->
他のブラウザーでも動作し、IE 9 でソースを再確認したので、PHP が適切に動作していると確信していますが、知っておいてほしいのは、PHP を使用してアプリ ID とチャネル ファイルを入力するということです。 URL。また、PHP SDK が既に Facebook にログインしていることを検出するかどうかに応じて、異なる JavaScript を出力します。すでに Facebook にログインしている場合は、ログアウトを監視しています。そうでない場合は、ログインを監視しています。これは、常に発生する auth.authResponseChange に切り替えるために必要です。
SOに関する複数の関連する質問を読み、考えられるすべてを試しましたが、これをIE 9で動作させることはできません。誰か提案できますか?