【发布时间】:2011-10-22 04:34:50
【问题描述】:
TL;DR Facebook javascript SDK 无法确定直接从其下的 facebook.com 注销的用户的准确登录状态。
我正在开发一个使用 javascript SDK 进行身份验证的 Facebook 应用程序。我注意到,当用户直接退出 Facebook(在 facebook.com 上)时,SDK 无法理解用户在应用页面上的登录状态。我将其归结为以下简单的测试用例。
在一个标签中登录 facebook.com。在另一个选项卡中,呈现下面的应用页面(根据需要替换 MY_APP_ID)。如果您以从未授予此应用程序权限的用户身份登录 facebook,请单击“登录”并授予他们权限。无论哪种方式,您都应该看到一些事件触发,表明您已登录。
现在,回到 facebook.com 选项卡,退出 facebook。转到应用选项卡并单击所有按钮(“登录”除外)并查看浏览器控制台输出。
当
FB.logout被调用时,什么也没有发生。永远不会调用回调。在 Chrome 中,给出以下错误:“不安全的 JavaScript 尝试从 URL http://www.facebook.com/ 的框架访问具有 URL http://my_app.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 服务器。看stackoverflow.com/questions/9482876/…
标签: javascript facebook facebook-javascript-sdk