【问题标题】:Facebook JS SDK FB.logout() doesn't terminate user sessionFacebook JS SDK FB.logout() 不会终止用户会话
【发布时间】:2012-02-07 17:00:10
【问题描述】:

我正在尝试使用 Facebook JS SDK 将用户从 facebook 中注销,但是调用:

FB.logout(function(response){
    console.log(response);
});

返回: response.status == "已连接"

只有在刷新页面后,SDK 才会意识到会话已经结束。任何人都知道可能导致这种行为的原因是什么?这段代码以前在我的应用程序中运行,最近开始以这种方式运行。

另一个使用 FireBug 的例子:

【问题讨论】:

  • 调用注销和刷新页面之前,如果您继续使用 Facebook,您是否仍然连接?如果您连续两次调用注销,它的响应是否相同? (如果不是,这不只是调用和响应之间的时间问题吗?)(而且,即使它没有回答“为什么”部分,你不能通过重新加载响应中的页面来解决这个问题吗?)哦,最后一个,“未定义”是我认为的另一个 console.log ?
  • @Flow' S,是的 'undefined' 是无关的控制台日志。 FB.logout() 确实将用户从 facebook 中注销,但当前页面 FB 对象直到刷新后才意识到这一点。我强烈希望不必在用户注销后手动刷新页面。我还尝试删除 fbsr_ cookie 以查看是否将其删除 - 没有效果。这以前有效,只是最近才改变。另外,我在使用 FB JS SDK 的 hulu.com 上尝试了相同的测试,结果相同。这可能是 SDK 中的错误吗?
  • 我目前正在使用来自FB.logout 回调的FB.getLoginStatus 来确保JS-SDK 忘记用户。
  • 重要提示:FB API 有很多细微差别,在很多层面上。帮自己一个忙,在初级开发期间使用https://connect.facebook.net/en_US/sdk/debug.js 而不是https://connect.facebook.net/en_US/sdk.js。您将在控制台中看到可爱的蓝色调试消息,您可以按文件名 (debug.js) 进行过滤:-)

标签: javascript facebook facebook-javascript-sdk


【解决方案1】:

https://developers.facebook.com/bugs/245362365535898?browse=search_4f112135664703a96454690 这是 JS SDK 中的一个错误,现已修复,应该不会太久。
在此之前,您可以执行以下操作

FB.logout(function(response) {
  FB.Auth.setAuthResponse(null, 'unknown');
  ...
});

【讨论】:

  • 感谢您与我合作并解决了我的大问题,感谢 :)
  • 我试过了,但是函数(响应)从未执行过,知道吗?
  • @JaredEitnier 什么不起作用?什么是版本 3?作为 JS SDK 的主要贡献者,我没听说过这个很有趣:)
  • 我昨天不知何故在疲倦的头脑中混淆了我认为的 PHP SDK 和 JS SDK 哈哈。无论如何,愚蠢的评论消失了:)
  • 似乎注销成功,但对我来说FB.Auth.setAuthResponse(null, 'unknown'); 之后的语句没有调用,就像一个简单的警报()
【解决方案2】:

http://hustoknow.blogspot.com/2012/01/dealing-with-zombie-facebook-cookies.html

当您注销时,会向 Facebook 发送一个跨域请求以使会话无效。当您点击重新加载时,另一个请求会发送到 Facebook 的网站——因为 FB 将 cookie 识别为无效,它会正确地从您的浏览器中删除 cookie。

我怀疑这是他们如何忘记解析 fbm_ cookie 的正则表达式错误,最近在最后一天左右引入。我很惊讶这个修复没有被推送。

【讨论】:

    【解决方案3】:
    FB.logout(function(response) {
      ...
    });
    

    这个 FB.logout 方法 100% 有效。 问题是用户试图从不起作用的 localhost 调用它。

    请尝试从服务器调用它。

    【讨论】:

    • 就我而言,是的,你是对的。它不适用于本地主机。但是我不确定你的话(100% 有效)。
    • 这在 XAMPP 的 localhost 中为我工作。可能是开发人员没有使用 https
    • 哇,是的,即使在今天,即使使用 https,这似乎也是正确的。从字面上看,它似乎在 localhost 上没有做任何事情
    【解决方案4】:

    由于我花了很多时间来确切了解 FB 注销中发生的情况,所以最好在这里与其他人分享。

    首先,请阅读文档here

    一个人登录 Facebook,然后登录您的应用。从您的应用注销后,此人仍会登录 Facebook。

    这一点浪费了我 90% 的时间。当我从 facebook.com 登录并尝试在我的应用程序中测试登录按钮时,它按预期工作,但注销并没有终止会话。

    解决方案或修复:根据文档中给出的方案,它不会终止用户会话,因为登录是从应用程序未启动,它来自 facebook.com。所以在这种情况下,fb 不会终止会话。

    当您从您的应用程序(新登录作为用户名和密码)登录 fb 时,系统将会话的源/触发器视为您的应用程序。因此,当您注销(window.FB.logout 或 FB.logout)时,它将完全终止用户会话。

    因此,在您的应用中测试登录功能之前,请先从 facebook.com 注销。

    如前所述,使用以下代码退出

    FB.logout(function(response) {
     // response from logout will have authResponse with access_token so better to test the status as it will return "unknown"
     if(response.status !== "connected") { } \\ do some check on the status of the login before considering successful logout.
    });
    

    最后但同样重要的是:要从 localhost 进行测试,请更新 FB APP 中的设置

    1. App Domains 更新为 localhost
    2. 网站下的网站网址http://localhost:3000/

    这将解决从 localhost 进行测试时遇到的问题

    【讨论】:

    • 看起来就是这样。但这种行为很奇怪,与谷歌不同,退出只会使您网站上的 oauth 授权无效,而不会真正将用户从他的谷歌帐户中注销。编辑:好的,我认为 Facebook 故意这样做是为了在所有网站上强制执行单个 FB 登录。
    【解决方案5】:

    FB.Logout() 没有像宣传的那样工作,我也有同样的经历。作为一种解决方法,我使用下面的 javascript 函数来检查用户是否已登录,如果是,则使用要加载的后续页面的 URL 及其访问令牌重定向到 https://www.facebook.com/logout.php

        function reallylogout() {
          FB.getLoginStatus(function (response) {
            if (response.authResponse) {
               window.location = "https://www.facebook.com/logout.php?next=" +
                 'URL to redirect to' +
                 "&access_token=" + response.authResponse.accessToken;
            } else {
               $("#loginButtonDiv").show();
               $("#logoutButtonDiv").hide();
            }
          });
        }
    

    显示/隐藏位只是 jQuery,用于显示或隐藏其中包含登录和注销按钮的 div。注销按钮的 onclick 触发了 realLogout() 函数。

    这适用于我的应用。

    【讨论】:

    • 这可行,但我真的在寻找一种解决方案,可以触发 FB JS SDK 在不执行页面刷新的情况下“忘记”登录用户。直到几周前,这仍然有效,从那以后我没有进行任何更改。
    【解决方案6】:

    我也遇到过类似的问题。我在注销后使用了FB.getLoginStatus()

    【讨论】:

      【解决方案7】:

      它在 Facebook 中似乎已损坏。在 FB rell 上,您可以登录,但注销功能不执行任何操作。 http://www.fbrell.com/auth/all-in-one

      【讨论】:

        【解决方案8】:

        好吧,伙计们,我找到了解决方案:

        像这样为注销<a>标签设置onClick事件

        onclick="FB.logout(function() { document.location.reload(); });"
        

        大家一起:

        <a href="#" 
           id="auth-logoutlink"
           style="float:left;font-size: small;"
           onclick="FB.logout(function() { document.location.reload(); });">
           [logout]
        </a>
        

        【讨论】:

          【解决方案9】:

          在 asp.net mvc 应用程序中,我按照以下方式进行操作。


          <a href="javascript:void(0);" class="logOff">Log out</a>
          

          $(function () {
          
          
              $(".logOff").click(function () {
          
                  //check if logout is 
                  FB.getLoginStatus(function (response) {
                      console.log('inside login status');
                      if (response.status === 'connected') {
                          // the user is logged in and has authenticated your
                          // app, and response.authResponse supplies
                          // the user's ID, a valid access token, a signed
                          // request, and the time the access token 
                          // and signed request each expire
                          var uid = response.authResponse.userID;
                          var accessToken = response.authResponse.accessToken;
                          FB.logout(function (response) {
          
                              FB.Auth.setAuthResponse(null, 'unknown');
          
                          });
                      } else if (response.status === 'not_authorized') {
                          // the user is logged in to Facebook, 
                          // but has not authenticated your app
          
                      } else {
                          // the user isn't logged in to Facebook.
                          console.log('response status not logged in');
                      }
                  });
                  window.location.href = '@Url.Action("LogOff", "Account")';
          
              });
          

          【讨论】:

          • FB.Auth,我使用 Facebook SDK 2.5 时不存在身份验证。
          【解决方案10】:

          这可能不起作用,因为您没有包含 Facebook 应用程序密钥。它对我有用:

           Ext.get('auth-logoutlink').on('click', function(){   
                            FB.getLoginStatus(function (response) {
                              if (response.authResponse) {
                                 window.location = "https://www.facebook.com/logout.php?confirm=1&api_key=**MYAPIKEY**&next=" +
                                   '**MYWEBSITEURL**' +
                                   "&access_token=" + response.authResponse.accessToken;
                              } else {
                                 //HIDE **LOGOUT BUTTON**
                                 //SHOW **LOGIN BUTTON**
                              }
                            });
                  }); 
          

          【讨论】:

            猜你喜欢
            • 2015-07-16
            • 2011-09-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多