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