0

我正在使用 Facebook PHP SDK 和 Facebook JS SDK 来管理 Web 应用程序中的身份验证。流程应该是这样的:单击 FB 登录按钮 -> 启动 OAuth 对话框 -> 在 OAuth 对话框中输入帐户详细信息 -> OAuth 对话框关闭并重新加载网页(现在显示经过身份验证的用户的内容)。我认为都是标准的。

我最初订阅了 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 的使用范围已经足够广泛,以至于支持它不是可选的,并且在登录后需要手动重新加载是不可接受的。

我相信我的代码很好,因为它在其他浏览器中正常工作,并且一旦触发事件,由 auth.authResponseChange 事件触发的代码即使在 IE 9 中也能正常运行——问题是由于某种原因,事件只是' t 触发,直到手动重新加载之后。不过,这里是我的 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 来填写 App ID 和频道文件网址。此外,根据 PHP SDK 是否检测到已登录 Facebook 来打印不同的 JavaScript。如果我们已经登录 Facebook,它正在等待注销;如果我们不是,它正在等待登录。这是必要的,因为切换到一直触发的 auth.authResponseChange。

我已经阅读了关于 SO 的多个相关问题并尝试了我能想到的一切,但我无法让它在 IE 9 下工作。任何人都可以提出任何建议吗?

4

0 回答 0