【发布时间】:2011-08-09 00:31:48
【问题描述】:
我在设计与 facebook 配合使用的网站的用户登录/注销机制时遇到了一些麻烦。
某些 facebook 事件的行为似乎违反直觉:
'auth.login' 在用户登录时在每次页面加载时触发。
FB.getLoginStatus() 在每次页面加载时触发,正如我所料
“auth.logout”仅在用户实际注销时触发,与“auth.login”不同,auth.logout 不会在用户未登录时在每次页面加载时触发。
我想构建一个系统来检测用户会话是否认为该用户已登录到 facebook。如果用户的会话被设置为相信他们已登录到 facebook,但实际上并没有,则对服务器执行 ajax 调用并更新会话。如果会话和 facebook js sdk 就用户是否登录达成一致,则什么也不做。如果用户的会话不知道用户已登录 facebook,但 js sdk 表示已登录,请使用 ajax 调用更新服务器。
我想创建一个与用户当前 facebook 登录状态同步的应用程序。而且我希望该应用程序在他们的 facebook 状态发生变化时登录/注销(通过对我的服务器执行 ajax 调用来更新他们的会话)。这很困难,因为我似乎无法可靠地检测到用户何时登录或退出 facebook。
我遇到的一个特殊问题是,当用户加载页面并登录到 facebook 时,auth.login 事件和 FB.getLoginStatus() 事件都会触发。
我的最终问题是,我必须使用什么 Facebook 事件组合或一般策略来创建这样的应用程序。我想要做的一个很好的例子是 hulu.com 实现 facebook 登录到他们的网站。感谢您阅读本文!
<script>
window.fbAsyncInit = function() {
FB.init({appId: '<?=$facebook_app_id?>',
status: true,
cookie: false,
xfbml: true});
FB.getLoginStatus(function(response) {
console.log('getLoginStatus');
console.log(response);
if(response.session){
if(window.module.Globals.prototype.oauth_uid != response.session.uid){
//authenticated user unknown to server, update server and set session
window.module.VCAuth.prototype.session_login();
}
}else{
if(window.module.Globals.prototype.oauth_uid){
//unauthenticated user with authenticated session, update server and unset session
window.module.VCAuth.prototype.session_logout();
}
}
});
FB.Event.subscribe('auth.login', function(response){
console.log('auth.login');
console.log(response);
});
FB.Event.subscribe('auth.logout', function(response){
console.log('auth.logout');
console.log('response');
});
};
(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>
【问题讨论】:
-
能够做你打算做的事情。即使我正在尝试类似的事情,我也无法正确注销用户,并让他保持注销。他会自动登录。
标签: javascript facebook facebook-graph-api facebook-javascript-sdk