2011-08-25 57 views
2

我使用FB的oauth成功驗證用戶身份,但我無法可靠地使用似乎推薦的方式註銷它們方法:使用FB JDK的FB.logout。Facebook oauth,IE,Chrome,Firefox和Android瀏覽器上的FB.getLoginStatus&FB.logout

具體來說,如果我使用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.logout外,我還沒有看到任何結束FB oauth會話的其他選擇。

其他人看到這些違規行爲還是有解決辦法?謝謝。

回答

0

Michael

使用您的方法,您需要將用戶access_token添加到您的註銷鏈接。或

使用登錄按鈕自動註銷鏈接功能。 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> 
+0

登錄此處的實時示例[鏈接](http://shawnsspace.com/plugins/af.php) –

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調用來撤銷服務器上的身份驗證,並且需要相當長的時間。

+0

1。我被註銷,另一頁上後立即檢查用戶的狀態,並同時'的getUser()'返航的ID,任何其他API調用被扔Facebook的API異常。沒想到用了幾秒鐘就可以完全退出。 – Ali

0

如果您不想註銷後,將用戶重定向,或者如果你想獲得肯定,認爲FB會議是在客戶端清晰,可以手動這三個命令清理:

FB._authResponse = null; 
FB._userStatus = null; 
document.cookie = 'fbsr_' + FB._apiKey + '=;'; // clear the facebook cookie 

他們甚至可以不FB.logout()執行,但在這種情況下,用戶不會從Facebook註銷,所以在刷新後,他將再次登陸。

相關問題