FB JS-SDK 无法检测到用户直接退出 FB
Posted
技术标签:
【中文标题】FB JS-SDK 无法检测到用户直接退出 FB【英文标题】:FB JS-SDK cannot detect user logging out of FB directly 【发布时间】: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 服务器。看***.com/questions/9482876/… 【参考方案1】:我认为这个解决方案现在不会对您有所帮助,但我发布它是为了让其他人不会有这么难的时间。
这是因为您没有正确实现 FB.getLoginStatus
方法。
你所要做的就是实现这个方法
FB.getLoginStatus(function(response)
statusChangeCallback(response);
);
在初始化调用之后。该方法会调用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
【讨论】:
这似乎不起作用。在您的页面上进行简单的测试登录。运行 FB.getLoginStatus,并记下响应。在另一个选项卡中,退出 facebook,返回您的页面并重新运行命令 - 就 api 而言,您仍处于登录状态。刷新页面,重新运行 FB.getLoginStatus - 最后页面通知。 是的,它不会不断 ping fb 服务器以了解状态,但是当您调用 fb api 时,它会检查并以这种方式工作。 其实就是把你的FB.getLoginStatus改成多了一个参数true
,就可以直接查询状态,解决问题。
请告诉我在哪里添加它,以便对其他人有用
我的做法是在我的“登录”点击处理程序中执行 FB.getLoginStatus(function() ... FB.login(...) ... , true)
,这似乎强制 statusChangedCallback 在登录调用期间成功查看更改。希望这是有道理的。【参考方案2】:
首先:为什么你到底想这样做?
Facebook 登录基本上只是为了方便 Facebook 用户避免在您的网页上填写注册或登录表单。它允许在您自己的网站上轻松设置用户会话,但据我所知,它没有任何权利让您直接从 Facebook 的会话中注销用户(也没有任何其他支持 Facebook 登录的网站,如 *** )。这也适用于相反的情况:如果用户退出 Facebook,这并不意味着他应该丢失通过 Facebook 登录建立的所有其他会话。
【讨论】:
以上是关于FB JS-SDK 无法检测到用户直接退出 FB的主要内容,如果未能解决你的问题,请参考以下文章
如何在不刷新页面的情况下使用 JS SDK 检测从 fb 注销