【问题标题】:Facebook Oauth LogoutFacebook Oauth 注销
【发布时间】:2011-02-15 09:43:51
【问题描述】:

我有一个使用 Oauth 2 与 Facebook 集成的应用程序。

我可以使用 FB 进行授权并完美地查询他们的 REST 和 Graph API,但是当我授权时,会使用 FB 创建一个活动的浏览器会话。然后我可以很好地退出我的应用程序,但与 FB 的会话仍然存在,因此如果其他人使用浏览器,他们将看到以前的用户 FB 帐户(除非以前的用户也手动退出 FB)。

我授权的步骤是:

  1. 致电 [链接:graph.facebook.com/oauth/authorize?client_id...]

如果用户的浏览器还没有活动的 FB 会话,此步骤将打开 Facebook 登录/连接窗口。一旦他们登录到 Facebook,他们就会使用我可以交换 oauth 令牌的代码重定向到我的网站。

  1. 使用 (1) 中的代码调用 [LINK: graph.facebook.com/oauth/access_token?client_id..]

现在我有一个 Oauth 令牌,并且用户的浏览器登录到我的网站和 FB。

  1. 我调用一堆 API 来做事:即 [LINK: graph.facebook.com/me?access_token=..]

假设我的用户想要退出我的网站。 FB 条款和条件要求我执行单点注销,因此当用户退出我的站点时,他们也会退出 Facebook。有人认为这有点愚蠢,但如果有任何实际实现的方法,我很乐意遵守。

我看到了以下建议:

A.我使用 Javascript API 注销:FB.Connect.logout()。好吧,我尝试使用它,但它不起作用,而且我不确定它到底是怎么做到的,因为我没有在我的网站上以任何方式使用 Javascript API。该会话不是由 Javascript API 维护或创建的,所以我也不确定它应该如何过期。

B.使用 [链接:facebook.com/logout.php]。这是前段时间 Facebook 论坛中的管理员建议的。给出的示例与获取 FB 会话(非 oauth)的旧方式有关,因此我认为我不能在我的情况下应用它。

C.使用旧的 REST api expireSession 或 revokeAuthorization。我尝试了这两种方法,虽然它们确实使 Oauth 令牌过期,但它们不会使浏览器当前正在使用的会话无效,因此它没有效果,用户没有从 Facebook 注销。

我真的有点不知所措,Facebook 文档不完整、模棱两可而且很差。论坛上的支持是不存在的,目前我什至无法登录 facebook 论坛,除此之外,他们自己的 FB Connect 集成甚至在论坛本身上都不起作用。不会激发太多信心。

Ta 可以提供任何帮助。 德里克

ps。不得不将 HTTPS 更改为 LINK,没有足够的业力来发布链接,这可能足够公平。

【问题讨论】:

  • 肖恩有一个观点,你应该听一听,因为他的名声比你高,这说明他是对的。如果我登录了 Facebook,然后我会来到你的网站,使用它(或者可能只是决定以极度失望的方式离开),然后退出,如果我发现我会感到惊讶甚至有点愤怒也已退出 Facebook。如果用户界面清楚地表明会发生这种情况,那很好,但如果它只是页面右上角的一个按钮,上面写着“注销”,也许附近漂浮着一个 facebook 徽标,那是相当令人惊讶的。惊喜不是好的用户界面的特征。
  • @Tom: developers.facebook.com/policy 第 6 行。
  • @DigitalPrecision:一个很好的链接,它表明即使是 Facebook 也无法做到这一点。
  • 同意。我们不得不跳过箍让它在我们的应用程序中工作。文档很糟糕。
  • 我遇到了完全相反的问题:退出我的自制应用程序时,我也立即退出了 facebook。

标签: facebook oauth logout


【解决方案1】:

我也有同样的问题。我也使用 oauth 登录(我使用的是 RubyOnRails),但对于注销,我使用 JavaScript 使用如下链接进行登录:

<a href="/logout" onclick="FB.logout();">Logout</a> 

这首先调用onclick函数并在facebook上执行注销,然后调用我网站的正常/logout函数。

虽然我也更喜欢服务器端解决方案,但至少它可以满足我的需求,它会让我在两个站点上都退出。

我对 Facebook 集成的东西也很陌生,并且是第一次使用它,但我的总体感觉是文档遍布各处,有很多过时的东西。

【讨论】:

  • 感谢克里斯托夫!我已经尝试过了,它确实有效。我之前一直在尝试使用 FB.Connect.logout 和 FB.Connect.logoutAndRedirect,我认为它们来自旧版本的 API。正如您所说,文档如果非常分散。只是添加 - 在调用 FB.logout 之前,我必须调用 FB.init,如 FB Javascript API 页面上所述。感谢您的帮助。
  • 刚刚更新,此解决方案在 Mac 上的 Chrome(至少 5.0.375)中不起作用。用户没有退出 FB,但在 Safari 和 Firefox 中工作正常..
  • 我的注销页面必须进行一些 FB 登录检查。 FB.logout() onclick 在重定向之前完成的速度不够快。我不得不延迟重定向以确保 FB.logout() 首先成功完成。
【解决方案2】:

这在现在有效 - 并且在 facebook 的网站 @http://developers.facebook.com/docs/authentication/记录。不确定它是多久添加到文档中的,当我检查 2012 年 2 月时很确定它不存在

您可以通过重定向以编程方式登录 Facebook 的用户 用户

https://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN

【讨论】:

  • 无法让它工作。使用服务器端连接方法。此外,如果文档链接一旦指向此方法,它就不再存在了。
  • @DanielGerson 当您使用 ssc 时,您将获得访问令牌作为来自 facebook 的响应。当您将访问令牌发送给客户端时,它将起作用,以便客户端可以在注销链接中使用它。
【解决方案3】:

此解决方案不再适用于 FaceBook 当前的 API(似乎不是一开始就打算这样做的)

http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com;

尝试在“yoursitename.com”所在的退出链接或按钮上提供此链接 是您在注销后要重定向回来的地方可能是您的主页。

有效..

【讨论】:

  • Sumit,谢谢。这完美无缺。我不完全确定为什么 facebook 的移动版本可以让您像那样注销,而另一个则不能,但我不在乎。它比我目前使用的 jscript hack 更好,也比这里描述的主要 facebook logout + session key 更容易。
  • 但是如果用户不想要他们的 facebook 会话被破坏怎么办?如果他们已经登录 Facebook,然后登录您的网站,然后退出您的网站,然后返回 facebook 并且不明白为什么他们刚刚退出,该怎么办?这似乎不是完美的解决方案...
  • 几个月前被问到这个问题时,单点注销是 Facebook 条款和条件的要求。我不确定它是否仍然存在,我不同意你的观点,但当时它是必需的。
  • 请参阅下面我的解决方案,了解目前有效的解决方案,并由 facebook 记录
【解决方案4】:

我可以通过将用户重定向到以编程方式将用户从 Facebook 注销

https://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN

下一个参数中提供的 URL 必须是与应用设置中定义的应用具有相同基域的 URL。

更多详情:https://developers.facebook.com/docs/authentication

【讨论】:

    【解决方案5】:

    您可以使用access_token

    $access_array = split("\|", $access_token);
    
    $session_key = $access_array[1];
    

    您可以在 PHP SDK 中使用 $session key 来生成功能性注销 URL。

    $logoutUrl = $facebook->getLogoutUrl(array('next' => $logoutUrl, 'session_key' => $session_key));
    

    这将结束浏览器的 facebook 会话。

    【讨论】:

    • 您不需要手动使用令牌,因为 $facebook 已经拥有它。
    • 您能更详细地解释一下您的意思吗?这种方法是我发现的唯一一种在不使用 javascript 的情况下注销用户并结束 FB 会话的方法
    • Bob,这是注销 URL 的结构:facebook.com/…> 其中 session_key 是我上面描述的访问令牌的中间部分。
    • 正如@Amir 指出的那样,会话密钥与您在初始 OAuth 授权期间从 Facebook 收到的“代码”相同。最好使用那个而不是尝试解析访问令牌(因为令牌的格式可能会改变)。
    • 使用与 Zach 相同的方法。以下是如何在 RoR + Devise + Omniauth github.com/intridea/omniauth/wiki/… 中进行完全注销
    【解决方案6】:

    我正在使用 PHP:

    <a href="?action=logout">logout.</a>
    
    if(isset($_GET['action']) && $_GET['action'] === 'logout'){
        $facebook->destroySession();
        header(WHERE YOU WANT TO REDIRECT TO);
        exit();
    }
    

    很好用,很简单,我现在只是想找到一个注销按钮图形!

    【讨论】:

      【解决方案7】:

      这是在当前 (2.12) 版本的 API 中工作的已接受答案的替代方案。

      <a href="#" onclick="logoutFromFacebookAndRedirect('/logout')">Logout</a>
      
      <script>
          FB.init({
              appId: '{your-app-id}',
              cookie: true,
              xfbml: true,
              version: 'v2.12'
          });
      
          function logoutFromFacebookAndRedirect(redirectUrl) {
              FB.getLoginStatus(function (response) {
                  if (response.status == 'connected')
                      FB.logout(function (response) {
                          window.location.href = redirectUrl;
                      });
                  else
                      window.location.href = redirectUrl;
              });
          }
      </script>
      

      【讨论】:

        【解决方案8】:

        Sumit 建议的移动解决方案非常适合 AS3 Air:

        html.location = "http://m.facebook.com/logout.php?confirm=1&amp;next=http://yoursitename.com"

        【讨论】:

          【解决方案9】:

          适用于希望直接从后端注销用户的 Python 开发人员

          在我写这篇文章的那一刻,m.facebook.com 的技巧不再有效(至少对我而言),用户被重定向到移动 FB 登录页面,这显然不利于用户体验。

          幸运的是,FB PHP SDK 有一个semi-documented solution(如果链接没有指向getLogoutUrl() 函数,只需在该页面上搜索即可)。 StackOverflow 上的至少另一个也提到了这一点:Facebook php SDK getLogoutUrl() problem

          顺便说一句,我刚刚注意到 Zach Greenberg got it right 在这个问题中,但我将我的答案添加为 Python 开发人员的摘要。

          【讨论】:

            【解决方案10】:

            克里斯托夫回答的注释: Facebook Oauth Logout 注销功能需要指定一个回调函数,如果没有就会失败 它,至少在 Firefox 上。 Chrome 无需回调即可工作。

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

            【讨论】:

              【解决方案11】:

              @Christoph:只是添加了一些东西。我不认为这是正确的方法。同时在两个地方注销。(&lt;a href="/logout" onclick="FB.logout();"&gt;Logout&lt;/a&gt;)。

              Just add id to the anchor tag . <a id='fbLogOut' href="/logout" onclick="FB.logout();">Logout</a>
              
              
              
              $(document).ready(function(){
              
              $('#fbLogOut').click(function(e){ 
                   e.preventDefault();
                    FB.logout(function(response) {
                          // user is now logged out
                          var url = $(this).attr('href');
                          window.location= url;
              
              
                      });
              });});
              

              【讨论】:

                【解决方案12】:

                Update: 这个解决方案有效,只是调用 'FB.logout()' 不起作用,因为浏览器希望用户交互来实际调用这个函数,所以它知道 - 它是用户而不是脚本。

                <a href="#" onclick="FB.logout();">Logout</a> 
                

                【讨论】:

                  【解决方案13】:

                  很简单,只需输入:$facebook->setSession(null);用于注销

                  【讨论】:

                    猜你喜欢
                    • 2011-12-03
                    • 2012-07-24
                    • 2012-02-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-01-29
                    • 2011-10-22
                    相关资源
                    最近更新 更多