我正在使用 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 下工作。任何人都可以提出任何建议吗?