我在设计与facebook合作的网站的用户登录/退出机制时遇到了一些麻烦。
某些facebook事件的行为似乎违反直觉:
' auth.login'用户登录时会在每个页面加载时触发。
FB.getLoginStatus()会在每个页面加载时触发,正如我所期望的那样
' auth.logout'仅在用户实际注销时触发,而不像“auth.login”,#39;当用户未登录时,auth.logout不会在每个页面加载时触发。
我想构建一个系统来检测用户会话是否认为用户已登录到facebook。如果用户的会话设置为相信他们已登录到Facebook,但他们实际上并未执行对服务器的ajax调用并更新会话。如果会话和facebook js sdk就用户是否登录达成一致,则不执行任何操作。如果用户的会话不知道用户登录到facebook但js sdk说他们是,请用ajax调用更新服务器。
我想创建一个与用户当前的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>
答案 0 :(得分:5)
我建议对所有方法使用相同的回调。这样您就可以获得一个身份验证代码路径。像这样:(与您提供的代码相差不远)
function authCallback(response) {
if(response && response.session){
if(window.module.Globals.prototype.oauth_uid != response.session.uid){
//authenticated user with invalid session
window.module.VCAuth.prototype.session_login();
}
}else{
if(window.module.Globals.prototype.oauth_uid){
//unauthenticated user with authenticated session
window.module.VCAuth.prototype.session_logout();
}
}
}
FB.getLoginStatus( authCallback );
FB.Event.subscribe('auth.login', authCallback);
FB.Event.subscribe('auth.logout', authCallback);
你说一个主要问题是:
同时激活auth.login事件和FB.getLoginStatus()事件。
在对服务器进行异步调用之前,确保session_logout()和session_login()设置/取消设置oauth_uid,以便下次调用回调时设置VCAuth的正确状态。
注意: auth.logout不会在每个页面加载时触发,因为auth.logout意味着用户已登录。如果用户从未登录,则触发auth.logout没有意义正确?
希望这有帮助。