gpt4 book ai didi

javascript - 对 JS SDK Facebook 事件的本质感到困惑

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:38:08 25 4
gpt4 key购买 nike

我在设计与 facebook 配合使用的网站的用户登录/注销机制时遇到了一些麻烦。

某些 facebook 事件的行为似乎违反直觉:

“auth.login”在用户登录时在每次页面加载时触发。

如我所料,FB.getLoginStatus() 在每次页面加载时触发

“auth.logout”仅在用户实际注销时触发,与“auth.login”不同,当用户未登录时,auth.logout 不会在每次页面加载时触发。

我想构建一个系统来检测用户 session 是否认为用户已登录到 facebook。如果用户的 session 设置为相信他们已登录到 facebook,但他们实际上并没有执行对服务器的 ajax 调用并更新 session 。如果 session 和 facebook js sdk 就用户是否登录达成一致,则什么都不做。如果用户的 session 不知道用户已登录到 facebook 但 js sdk 说他们是,则使用 ajax 调用更新服务器。

我想创建一个与用户当前 facebook 登录状态同步的应用程序。我希望该应用程序在 facebook 状态发生变化时登录/注销(通过对我的服务器执行 ajax 调用来更新他们的 session )。这很难,因为我似乎无法可靠地检测到用户何时登录或退出 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>

最佳答案

我建议对所有方法使用相同的回调。通过这种方式,您只需担心一个身份验证代码路径。像这样:(与您提供的代码相距不远)

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);

您说的一个主要问题是:

BOTH the auth.login event and the FB.getLoginStatus() events fire.

只需确保 session_logout() 和 session_login() 在对服务器进行异步调用之前设置/取消设置 oauth_uid,以便下次调用回调时设置正确的 VCAuth 状态。

注意: auth.logout 不会在每次页面加载时触发,因为 auth.logout 暗示用户已登录。如果用户从未登录过,则触发 auth.logout 没有意义对吧?

希望这对您有所帮助。

关于javascript - 对 JS SDK Facebook 事件的本质感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6990199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com