1

由于某种原因,今天我为现有成员自动登录的代码坏了。通常这段代码工作得很好,在检查了萤火虫后,我发现由于某种原因找不到“auth.login”,因此调用了 window.location.reload(); 不工作。(如果我手动刷新然后成员显示为正确连接,问题只是在会话打开之前自动登录需要刷新页面)我还尝试查看问题是否只是“auto.login”并将其替换为'auth.authResponseChange' 当我这样做时,页面不断刷新......所以我认为问题出在'auth.login' 触发器上。有没有人知道出于特殊原因或 Facebook 所做的任何更改可能导致此问题?

*更新* BUG 已解决!这个问题已经被脸书解决了。

此错误已报告并由 facebook 在这里回答-

https://developers.facebook.com/bugs/524245490930206?browse=search_50f87d9e8869a5e06191882#

顺便说一句,这是一个再次工作的代码:

<div id="fb-root"></div>
    <script>
      window.fbAsyncInit = function() {
        FB.init({
              appId  : '<?php =$APP_ID ?>',
              status : true, // check login status
              cookie : true, // enable cookies to allow the server to access the session
              xfbml  : true,  // parse XFBML
              oauth  : true
        });

      // Additional initialization code here
        FB.Event.subscribe('auth.login', function(response) {
          window.location.reload();
        });
      };
      // Load the SDK Asynchronously
      (function(d){
         var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
         if (d.getElementById(id)) {return;}
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
         ref.parentNode.insertBefore(js, ref);
       }(document));
    </script>
4

3 回答 3

3

我从 auth.login 更改为 auth.statusChange,并将所有内容都包装在 getLoginStatus 中,因此它仅在未连接时运行,似乎工作正常。看起来像这样(在 window.fbAsyncInit = function() { 内)

  FB.getLoginStatus(function(response) {
    if (response.status != 'connected') {
      FB.Event.subscribe('auth.statusChange', function(response) {
        if (response.authResponse) {
          // whatever code runs when user logs in
        }
      });
    }
  });
于 2013-01-21T17:53:09.327 回答
1

看来我遇到了同样的问题..

直到几个小时前,当一个用户(之前已经授权并登录到我的应用程序)打开我的网站并且 cookie 已过期时,登录按钮出现但在几秒钟后(JS SDK 触发的时间)登录功能),他自动登录,页面重新加载,没有登录按钮和用户信息。

现在,当一个已经注册的用户在 cookie 过期后打开我的网站时,登录按钮会再次出现,但用户不会自动登录,并且页面不会像以前那样重新加载。奇怪的是,如果我点击登录按钮,它也不起作用!如果我现在手动刷新页面,登录按钮会消失并显示用户信息,所以看起来用户实际上已登录,但未捕获事件以触发页面重新加载。

如果我手动注销并再次登录(因此使用 php sdk)一切正常。

我的代码:

<script>
        window.fbAsyncInit = function() {
            FB.init({
                appId: '<?php echo $facebook->getAppID() ?>',
                cookie: true,
                xfbml: true,
                oauth: true
            });
            FB.Event.subscribe('auth.login', function(response) {
                window.location.reload();
            });
            FB.Event.subscribe('auth.logout', function(response) {
                window.location.reload();
                });
        };
        (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);
        }());
        function facebookLogin() {
            FB.login(function(response) {
                // handle the response
            }, {scope: 'email, publish_stream, read_friendlists'});
        }
    </script>

更新我将这几行添加到我的 js 代码中:

FB.Event.subscribe('auth.statusChange', function(response) {
                alert('The status of the session is: ' + response.status);
            });

所以现在当用户在令牌过期后打开我的页面时:

  • php sdk 检测到他没有登录并显示登录对话框(像以前一样)
  • javascript sdk 触发登录功能(像以前一样)
  • 用户定期登录(像以前一样)(我现在可以肯定地知道它,因为它会弹出警报:会话的状态是:已连接)
  • 但是 .. 未触发事件 auth.login -> 脚本不知道成功登录 -> 页面未重新加载
于 2013-01-16T14:21:42.890 回答
0

我遇到了完全相同的问题。如果用户连接了我的应用程序并且他们的访问令牌已过期,javascript SDK 会使用户自动登录并重新加载页面。

我通过切换到 auth.statusChange 而不是 auth.login 解决了这个问题。然后我检查 PHP Facebook SDK 用户是否登录,如果他登录了,我不订阅 javascript 中的 auth.statusChange 事件。(如果您在用户登录时在 javascript 中包含 auth.statusChange,您最终会陷入无限的页面刷新循环,至少我的实现是这样)。

于 2013-01-16T19:09:48.663 回答