无法使用 Facebook C# SDK 注销 Facebook

Posted

技术标签:

【中文标题】无法使用 Facebook C# SDK 注销 Facebook【英文标题】:Cannot Logout of Facebook with Facebook C# SDK 【发布时间】: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。我根本无法找到任何显示这种方法如何工作的低级文档。

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

【问题讨论】:

【参考方案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 时,用户都会被重定向到登录页面。

【讨论】:

以上是关于无法使用 Facebook C# SDK 注销 Facebook的主要内容,如果未能解决你的问题,请参考以下文章

Facebook-connect:无法使用PHP SDK + JS SDK注销

Facebook 注销在新 SDK 中不起作用

使用 facebook SDK for ios 6 实现 Facebook 注销

Facebook SDK 注销问题

如何使用 Facebook SDK 在我的应用程序中注销 Facebook

如何在不使用 Facebook 登录/注销按钮的情况下以编程方式从 Facebook SDK 3.0 注销?