我正在使用FB的oauth成功验证用户身份,但是我无法使用看似推荐的方法可靠地登出它们:FB.logout使用FB JDK。
具体来说,如果我正在使用Chrome或Firefox,则调用FB.logout
(加载FB JDK并调用FB.init
之后)成功撤销在oauth期间授予的FB身份验证。但是,它似乎不适用于IE或Android浏览器。当我说它在IE和Android浏览器中不起作用时,我的意思是在调用FB.logout
后续重定向到www.facebook.com/dialog/oauth..
加载我的回调页面而不提示用户再次输入凭据。在Chrome和Firefox中,此时“正确”提示他们这样做。
我的各种调试尝试让我意识到对FB.getLoginStatus
的调用(即使在调用FB.logout
之后)也会将有效的response.session对象传递给每个浏览器中的回调。因此,根据FB.getLoginStatus,即使在FB.logout之后,会话仍然在每个浏览器中都处于活动状态。这让我想知道我的FB.logout可以工作。
我知道oauth和FB JDK是两个不同的东西,并不一定意味着很好地一起玩,但我没有看到任何其他替代结束FB oauth会话,除了调用FB.logout。
其他人是否看到过这些违规行为或有解决方案?谢谢。
答案 0 :(得分:3)
我在发布上述内容后找到了这个答案:
它建议在setTimeout函数中调用FB.logout后重定向。基本上,给FB.logout函数大约2000毫秒来完成。
我试过了,它修复了IE和Android浏览器中的问题。基本上,Chrome和Firefox拥有足够快的JavaScript引擎,FB.logout将在浏览器中加载新页面之前完成执行,而IE和Android浏览器则不会。
遵循这个逻辑,我意识到FB.logout有一个回调函数的原因,使用它来进行任何重定向可能更安全(而不是使用setTimeout延迟)。
function mysignout()
{
FB.logout(function()
{
top.location.href = '../mobile.php'
});
}
出于好奇,我测试了看Chrome和IE中执行回调的时间差异。 Chrome用2511毫秒完成注销IE浏览器耗时3517毫秒。我觉得让我感到困惑的是,我认为FB.logout刚刚在本地删除了cookie,并且根本没有时间。相反,看起来它是某种类型的ajax调用来撤销服务器上的身份验证,并且需要相当长的时间。
答案 1 :(得分:0)
迈克尔
使用您的方法,您需要将用户access_token附加到您的注销链接。 OR
使用登录按钮自动注销链接功能。 autologoutlink ='真'
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '135669679827333',
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true, // parse XFBML
//channelUrl : 'http://WWW.MYDOMAIN.COM/channel.html', // channel.html file
oauth : true // enable OAuth 2.0
});
// redirect user on login
FB.Event.subscribe('auth.login', function(response) {
top.location.href = 'http://example.com/loggedin/';
});
// redirect user on logout.
FB.Event.subscribe('auth.logout', function(response) {
top.location.href = "http://example.com/loggedout/";
});
};
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
<fb:login-button autologoutlink='true' scope='email,publish_stream'></fb:login-button>
答案 2 :(得分:0)
如果您不想在注销后重定向用户,或者如果您想确定FB Session在客户端是清除的,则可以使用以下三个命令手动清除:
FB._authResponse = null;
FB._userStatus = null;
document.cookie = 'fbsr_' + FB._apiKey + '=;'; // clear the facebook cookie
它们甚至可以在没有 FB.logout()的情况下执行,但在这种情况下,用户不会从Facebook注销,因此刷新后,他将再次登录。