【问题标题】:Cannot Logout of Facebook with Facebook C# SDK无法使用 Facebook C# SDK 注销 Facebook
【发布时间】:2011-09-17 15:55:45
【问题描述】:

我想我已经阅读了有关在桌面应用程序中注销 Facebook 的所有内容。到目前为止没有任何效果。

具体来说,我想注销用户,以便他们可以切换身份,例如在家共享电脑的人可以通过自己的 Facebook 帐户使用该软件,但没有机会切换帐户,非常混乱。 (尚未测试切换 Windows 用户帐户,因为这对最终用户的要求实在是太多了,而且应该没有必要。)

现在,我应该说我已将应用程序设置为使用这些权限:

string[] permissions = new string[] { "user_photos", "publish_stream", "offline_access" };

因此,其中包含“offline_access”。我不知道这是否/应该影响注销。

同样,我退出的目的仅仅是切换用户。 (如果有更好的方法,请告诉我。)

声称的解决方案似乎是:

  • 使用 JavaScript SDK (FB.logout())
  • 改用“m.facebook.com”
  • 创建您自己的 URL(并可能使用 m.facebook.com)
  • 创建您自己的 URL 并使用会话变量(在 ASP.NET 中)

第一个有点傻。为什么在使用 C# 时使用 JavaScript?这是一种倒退,在桌面应用程序中有很多额外的开销。 (我没有尝试过,因为在桌面应用程序中这样做简直令人作呕。)如果有人可以确认这是唯一的工作方法,请这样做。我拼命地试图避免它。

第二个不起作用。也许它在过去有效,但我无数次尝试让它工作都失败了。

第三个不起作用。我已经尝试了无数种变化,但成功率为零。

最后一个选项不适用于桌面应用程序,因为它不是 ASP.NET,而且您没有可使用的会话变量。

Facebook C# SDK 注销也不再有效。即

public FacebookLoginDialog(string appId, string[] extendedPermissions, bool logout)
{
    IDictionary<string, object> loginParameters = new Dictionary<string, object>
                              {
                              { "response_type", "token" },
                              { "display", "popup" }
                              };

    _navigateUri = FacebookOAuthClient.GetLoginUrl(appId, null, extendedPermissions, logout, loginParameters);

    InitializeComponent();
}

我记得它过去有效,但现在不再有效。 (这真的让我很困惑......)

它现在将用户定向到 Facebook 移动页面,用户必须在该页面手动注销。

现在,我可以进行浏览器自动化以自动单击用户的注销链接,但是,如果 Facebook 更新移动 UI,这很容易中断。它也很混乱,并且可能比尝试使用 JavaScript SDK FB.logout() 方法更糟糕(虽然不是很多)。

我搜索了某种文档,但是在 Facebook 开发人员文档中找不到任何说明如何注销应用程序的内容。

有没有人解决过这个问题,或者看过任何可以移植到 Facebook C# SDK 的文档?

如果有人能指出一些可以使用它的文档,我当然愿意使用 WebClient 或 HttpClient/Response。我根本无法找到任何显示这种方法如何工作的低级文档。

提前感谢您提供任何建议、指示或链接。

【问题讨论】:

    标签: facebook facebook-c#-sdk logout


    【解决方案1】:

    看到这个blog post

    使用 FacebookOAuthClient() 获取注销 url 并向该 url 发送 http 请求..

    【讨论】:

    • 谢谢。我试试看!
    • 抱歉——这不起作用。它做同样的事情,即注销尝试返回 Facebook 移动页面 (m.facebook.com) 并且用户仍处于登录状态。
    【解决方案2】:

    好吧,我没有发现任何有用的东西,所以我求助于一个讨厌的黑客。

    FacebookOAuthClient.GetLogoutUrl() 方法 URL 不会让我退出,但是它会返回一个“m.facebook.com” URL,例如:

    http://m.facebook.com/logout.php?next=http://www.facebook.com/dialog/oauth/?response_type=token&display=popup&scope=user_about_me%252coffline_access&client_id=123456789012345&redirect_uri=http%253a%252f%252fwww.facebook.com%252fconnect%252flogin_success.html&confirm=1

    移动页面的底部有一个“退出”链接。

    试图抓住锚标记:

    HtmlElementCollection hec = wbrFacebookAuth.Document.GetElementsByTagName("a");
    foreach (HtmlElement elem in hec)
    {
        // the logout link has a data-sigil="logout" attribute:
        string datasigil = elem.GetAttribute("data-sigil").ToLower();
        if (datasigil == "logout")
        {
        wbrFacebookAuth.Navigate(elem.GetAttribute("href"));
        break;
        }
    }
    

    在 Navigated WebBrowser 事件中是不可预测和不可靠的。捕捉它的实际方法无关紧要。例如这也不起作用:

            string logoutPattern = @"<a href=""(/logout.[^""]+)""";
    
            Regex rx = new Regex(logoutPattern);
            if (rx.IsMatch(wbMain.DocumentText))
            {
                MatchCollection mc = rx.Matches(wbMain.DocumentText);
                if (mc.Count > 0)
                {
                    foreach (Match m in mc)
                    {
                        Console.WriteLine("*** " + m.ToString());
                    }
                }
            }
    

    但是,它可以在 DocumentCompleted 事件处理程序中可靠地捕获。

    private void wbrFacebookAuth_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
       if (_logout)
       {
        HtmlElementCollection hec = wbrFacebookAuth.Document.GetElementsByTagName("a");
        foreach (HtmlElement elem in hec)
        {
            // the logout link has a data-sigil="logout" attribute:
            string datasigil = elem.GetAttribute("data-sigil").ToLower();
            if (datasigil == "logout")
            {
            wbrFacebookAuth.Navigate(elem.GetAttribute("href"));
            break;
            }
        }
       }
    }
    

    问题是它现在加载的是 2 页而不是 1 页,而且还是有点乱。但是,它有效。

    【讨论】:

      【解决方案3】:

      这个问题已经回答here,建议使用下面的 url 注销,因为 facebook 显然跳过了“next”参数

      https://www.facebook.com/logout.php?next=[redirect_uri]&access_token=[access_token]
      

      【讨论】:

        【解决方案4】:

        有同样的问题,缺少注销按钮,前几天通过谷歌找到了这个提示:

        打开https://developers.facebook.com/?ref=pf(称为“facebook开发者网站”),您可以再次找到通常的登录/退出按钮。

        不要问我它是如何工作的以及它为什么工作,我只是按照我发现自己的说明进行操作,它对我有用

        祝你好运

        【讨论】:

          【解决方案5】:

          我猜您想注销用户,以便您可以登录另一个帐户。在这种情况下,我建议使用 WebAuthenticationBroker:

          经过一段时间的试验并且对上述任何示例都没有运气后,我发现提交带有重定向 url 到您的登录 url 的注销请求非常有效。

          这是我用来将请求链接在一起的代码:

          var logIn = this.Client.GetLoginUrl(
                        new
                        {
                          client_id = AppId,
                          redirect_uri = App.FacebookAuthUri.AbsoluteUri,
                          scope = AuthTokens.FACEBOOK_PERMISSIONS,
                          display = "popup",
                          response_type = "token"
                        });
          
          
              var logOut = this.Client.GetLogoutUrl(new
              {
                next = logIn,
                access_token = Settings.FacebookToken.Value
              });
          
              if (Settings.FacebookToken.Value != null) WebAuthenticationBroker.AuthenticateAndContinue(logOut);
          

          现在,每次您将用户定向到 WebAuthenticationBroker 时,用户都会被重定向到登录页面。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-04-07
            • 1970-01-01
            • 2012-03-06
            • 2013-04-12
            • 2011-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多