问题描述
|
我想我已经阅读了有关在桌面应用程序内注销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显然跳过了“ next”参数
https://www.facebook.com/logout.php?next=[redirect_uri]&access_token=[access_token]
, 我猜想您要注销用户,以便可以登录另一个帐户。在这种情况下,我建议使用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时,都会将用户重定向到登录页面。
, 看到这篇博客文章
使用FacebookOAuthClient()获取注销URL,并向该URL发送一个http请求。
,好吧,我没有发现任何有效的方法,因此我采取了讨厌的方法。
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页,仍然有点混乱。但是,它起作用。
, 在缺少注销按钮时遇到了同样的问题,前几天通过Google找到了这个提示:
打开https://developers.facebook.com/?ref=pf(称为\“ facebook开发者网站\”),您可以在其中再次找到通常的登录/注销按钮。
不要问我它是如何工作的,为什么它会工作,我只是按照我发现自己的指示使用,它对我有用
祝你好运,祝你好运