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

标签 javascript facebook facebook-graph-api facebook-javascript-sdk

我在设计与 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/

相关文章:

javascript - Googlemaps v3 地面覆盖循环

javascript - 我的加载更多功能适用于单击按钮,但不适用于滚动

facebook - Facebook 评论社交插件是否有可以添加评论的 API?

Facebook 图形 API : offset_y offset_x

javascript - JS页面根据URL显示

javascript - 使用 LoDash 对时间序列数据进行分组和求和

php - Facebook 登录困惑

facebook - HybridAuth Facebook 登录错误 : "Invalid Scopes: offline_access, publish_stream, read_friendlists"

facebook - 从 Facebook API 搜索

android - 在android中使用最新的facebook sdk获取好友列表