【问题标题】:Confused by nature of JS SDK Facebook Events对 JS SDK Facebook 事件的性质感到困惑
【发布时间】: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


【解决方案1】:

我建议对所有方法使用相同的回调。这样,您就可以担心一个身份验证代码路径。像这样:(与您提供的代码相差不远)

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 没有意义对吧?

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多