Facebook oauth,FB.getLoginStatus&关于IE,Chrome,Firefox和Linux的FB.logout Android浏览器

时间:2011-08-25 20:55:30

标签: android facebook firefox google-chrome oauth

我正在使用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。

其他人是否看到过这些违规行为或有解决方案?谢谢。

3 个答案:

答案 0 :(得分:3)

我在发布上述内容后找到了这个答案:

FB.logout not working in IE8

它建议在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注销,因此刷新后,他将再次登录。