对JS SDK Facebook Events的性质感到困惑

时间:2011-08-09 00:31:49

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

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

1 个答案:

答案 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没有意义正确?

希望这有帮助。