2011-10-22 84 views
9

TL; DR Facebook的javascript SDK無法確定直接從facebook.com下注冊的用戶的準確登錄狀態。FB JS-SDK無法檢測到用戶直接從FB註銷

我正在開發一個使用JavaScript SDK進行身份驗證的Facebook應用程序。我注意到,當用戶直接(在facebook.com上)註銷Facebook時,SDK無法理解用戶在應用程序頁面上的登錄狀態。我將它簡化爲以下簡單的測試用例。

在一個標籤頁中登錄到facebook.com。在另一個選項卡中,呈現下面的應用程序頁面(根據需要替換MY_APP_ID)。如果您以未曾授予此應用程序權限的用戶身份登錄Facebook,請點擊「登錄」並授予他們。無論哪種方式,您應該會看到一些表明您已登錄的事件消息。

現在回到facebook.com選項卡上,退出Facebook。轉到應用程序選項卡並單擊所有按鈕(「登錄」除外),然後查看瀏覽器控制檯輸出。

  • 當調用FB.logout時,沒有任何反應。回調從未被調用。在Chrome中,出現以下錯誤:「不安全的JavaScript嘗試訪問來自框架的網址爲http://my_app.com的幀,網址爲http://www.facebook.com/。域,協議和端口必須匹配。」

  • 當調用FB.getLoginStatus時,響應表示「連接」並且具有authResponse對象。但這並沒有幫助,因爲它現在不正確。如果傳遞給「force」參數爲true,則不會發生任何事情(回調從不會被調用)。

  • 當調用FB.getAuthResponse時,什麼也沒有發生(回調永遠不會被調用)。

  • 任何相關事件都不會在任何此類事件中觸發(在註銷Facebook之後)。

問題是,在這種情況下,似乎沒有辦法從SDK合法確定用戶的登錄狀態。或者我正在做一些愚蠢的事情,儘管我已經把它簡化到最低限度。

我的最終目標是在這種情況下,我希望能夠做如果用戶在已經註銷Facebook之後點擊我的註銷按鈕。但是SDK沒有提供實現這一目標的可行方法。

任何想法或想法?是否有其他人遇到過這種情況並找到解決方法?謝謝!

簡單的應用程序頁面:

<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:fb='http://www.facebook.com/2008/fbml'> 
<head> 
</head> 
<body> 
<script> 
    window.fbAsyncInit = function() { 
    function subFBEvent(name) { 
     FB.Event.subscribe(name, function(r) { 
     console.log(name); 
     console.log(r); 
     }); 
    } 
    subFBEvent('auth.login'); 
    subFBEvent('auth.logout'); 
    subFBEvent('auth.authResponseChange'); 
    subFBEvent('auth.statusChange'); 
    FB.init({ 
     appId : 'MY_APP_ID', 
     status : true, // check login status 
     cookie : true, // enable cookies to allow the server to access the session 
     xfbml : true, // parse XFBML 
     oauth : true  // use OAuth 2.0 
    }); 
    }; 
    (function() { 
    var s = document.createElement('div'); 
    s.setAttribute('id','fb-root'); 
    document.documentElement.getElementsByTagName("body")[0].appendChild(s); 
    var e = document.createElement('script'); 
    e.src = 'http://connect.facebook.net/en_US/all.js'; 
    e.async = true; 
    s.appendChild(e); 
    }()); 
</script> 
<button onclick="FB.logout(function(r) { console.log('FB.logout'); console.log(r); });">Logout</button> 
<button onclick="FB.getLoginStatus(function(r) { console.log('FB.getLoginStatus'); console.log(r); });">LoginStatus</button> 
<button onclick="FB.getAuthResponse(function(r) { console.log('FB.getAuthResponse'); console.log(r); });">AuthResponse</button> 
<fb:login-button>Login</fb:login-button> 
</body> 
+0

就迫使往返Facebook的服務器這個頁面。看看 http://stackoverflow.com/questions/9482876/how-to-detect-user-logging-out-of-facebook-after-logging-int-my-app/16227872#16227872 – Delmo

回答

-2

首先:爲什麼你到底要做到這一點?

Facebook登錄基本上只是爲了方便Facebook用戶避免在網頁上填寫註冊表或登錄表單。它允許您在自己的網站上輕鬆設置用戶會話,但據我所知,它不會讓您有權直接在Facebook上將用戶從會話中註銷(也不會有任何其他Facebook登錄功能的網站,如Stackoverflow )。這也是相反的:如果用戶註銷Facebook並不意味着他將失去通過Facebook登錄建立的所有其他會話。

0

我不認爲這個解決方案現在可以幫助你,但我發佈它,以便別人不會有這麼難的時間。 這是因爲您沒有正確實施FB.getLoginStatus方法。 所有你需要做的就是實現這個方法

FB.getLoginStatus(function(response) { 
    statusChangeCallback(response); 
    }); 

在init調用之後。此方法將調用statusChangeCallback方法並執行身份驗證。

function statusChangeCallback(response) { 
    console.log('statusChangeCallback'); 
    console.log(response); 
    // The response object is returned with a status field that lets the 
    // app know the current login status of the person. 
    // Full docs on the response object can be found in the documentation 
    // for FB.getLoginStatus(). 
    if (response.status === 'connected') { 
     // Logged into your app and Facebook. 
     testAPI(); 
    } else if (response.status === 'not_authorized') { 
     // The person is logged into Facebook, but not your app. 
     document.getElementById('status').innerHTML = 'Please log ' + 
     'into this app.'; 
    } else { 
     // The person is not logged into Facebook, so we're not sure if 
     // they are logged into this app or not. 
     document.getElementById('status').innerHTML = 'Please log ' + 
     'into Facebook.'; 
    } 
    } 

更多的參考,你可以參考官方文檔 https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.0

+0

This doesn似乎沒有工作。簡單的測試 - 在您的頁面上登錄。運行FB.getLoginStatus,並記下響應。在另一個選項卡中,退出Facebook,返回到您的頁面並重新運行命令 - 就api而言,您仍然登錄。刷新頁面,重新運行FB.getLoginStatus,最後運行頁面通知。 – mseddon

+0

是的,它不會經常ping fb服務器來了解狀態,但是當你調用一個fb api時,它會檢查並以這種方式工作。 –

+0

實際上,通過將FB.getLoginStatus更改爲具有附加參數'true',將直接查詢狀態,解決問題。 – mseddon