0

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で動作させることはできません。誰か提案できますか?

4

0 に答える 0