C#Facebook SDK将accessstoken延长至60天
主要问题:如何通过C#SDK扩展60天访问令牌的2小时访问令牌? 您是否可以提供仅针对2小时访问令牌交换代码的部分的示例?
背景:我一直在这里寻找并尝试各种解决方案,但还没有找到适合我的方案。 我可以成功地进行/我调用并获取有关当前用户的信息,但是当我尝试扩展访问令牌时,它失败了。
此应用程序的目标是允许用户设置post并在事件发生后监视喜欢和评论一段时间。 显然,我们需要60天令牌。
当你可以申请永久令牌时,其他人完成了90%的工作后,我正在接受这个项目。 我的工作是修复它,以便我们可以使用60天令牌。 我可能会问非常愚蠢的后续问题。 做好准备!
当前流程:用户设置他的post,点击一个按钮,我们提示他们通过javascript sdk授权我们的app /登录到facebook。 在他们登录后,我们在javascript中处理其他无关的东西,然后将其AJAX转移到C#以将一些信息保存到我们的数据库(包括令牌)并发布post。 一切都很好,我在javascript中获得访问令牌就好了,我可以使用该2小时令牌来获取登录用户的信息,但是当我尝试扩展时,我得到两个错误中的一个,我将在下面提到导致它们的代码。
我尝试过的:
工作:我相信我在这里发现了另一篇文章。 var fbClient = new FacebookClient(accessToken);
Dictionary parameters = new Dictionary(); parameters.Add("client_id", appId); parameters.Add("redirect_uri", redirectURI); parameters.Add("client_secret", appSecret); parameters.Add("code", accessToken); var result = fbClient.Get("/me", parameters);
不工作:这来自各个地方,包括这里和sdk文档。 我已经看到人们包括重定向url,并说当你最初获得accessstoken时它需要匹配,但我们在javascript中做了这个并且没有使用重定向url。 Dictionary parameters2 = new Dictionary();
parameters2.Add("client_id", appId); //parameters2.Add("redirect_uri", redirectURI); parameters2.Add("client_secret", appSecret); //parameters2.Add("code", accessToken); parameters2.Add("grant_type", "fb_exchange_token"); parameters2.Add("fb_exchange_token", accessToken); var result2 = fbClient.Get("/oauth/access_token", parameters2);
错误:{Newtonsoft.Json.JsonReaderException:解析值时遇到意外的字符:a。 第1行,第1位。错误2:如果我注释掉grant_type和fb_exchange_token并取消注释代码和redirecturi,我会得到与下一个方法相同的错误…
不工作:我从另一个post抓取这里复制/粘贴重命名以匹配我的vars。 无法获得长期到期令牌
dynamic result3 = new ExpandoObject(); try { dynamic parameters3 = new ExpandoObject(); parameters3.grant_type = "fb_exchange_token"; parameters3.fb_exchange_token = accessToken; parameters3.client_id = appId; parameters3.client_secret = appSecret; result3 = fbClient.Get("oauth/access_token", parameters); } catch (FacebookOAuthException err) { result3.error = "Error"; result3.message = err.Message; } catch (Exception err) { result3.error = "Error"; result3.message = err.Message; }
错误:{(OAuthException)(OAuthException)validation码格式无效。}
将以下代码与Facebook.NET和Json.NET一起使用在作为回调的处理程序文件中。
public void ProcessRequest (HttpContext context) { if (context.Request.Params.Get("error_reason") == "user_denied") { context.Response.Write("Access Denied"); } else if (context.Request.Params.Get("code") != null && context.Request.Params.Get("code") != "") { string shorttoken = HttpUtility.ParseQueryString(HttpUtil.GetHtmlPage("https://graph.facebook.com/oauth/access_token?client_id=" + APP_ID + "&redirect_uri=http://huadianz.me/mvp/auth/FacebookOAuth.ashx&client_secret=" + APP_SECRET + "&code=" + context.Request.Params.Get("code")))["access_token"]; string longtoken = HttpUtility.ParseQueryString(HttpUtil.GetHtmlPage("https://graph.facebook.com/oauth/access_token?client_id=" + APP_ID + "&client_secret=" + APP_SECRET + "&grant_type=fb_exchange_token&fb_exchange_token=" + shorttoken))["access_token"]; Facebook.FacebookClient fc = new Facebook.FacebookClient(longtoken); dynamic result = fc.Get("me"); context.Response.Redirect("/"); //Store Token here } }
我的实用工具文件在这里:
public static class HttpUtil { public static string GetHtmlPage(string strURL) { String strResult; WebResponse objResponse; WebRequest objRequest = HttpWebRequest.Create(strURL); objResponse = objRequest.GetResponse(); using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) { strResult = sr.ReadToEnd(); sr.Close(); } return strResult; } }
请参阅如何使用其C#SDK更新Facebook访问令牌 。 仅仅请求“oauth / access_token”是不够的,您还必须在那里指定参数。 那里的技术对我有用。
- 如何将Segment.io服务器和客户端事件连接到同一个匿名用户?
- 具有子集合的AngularJs Post Object到MVC WebAPI
- 如何根据驻留在updatePanel中的DataGrid中的行选择更新控件?
- ASP.NET用户控件中的Javascript函数
- 如果cookie存在,即使它是在另一个应用程序中创建的,如何检查? (使用JS或C#)
- 如何在ASP.NET中创建一个简单的是/否弹出窗口,将结果返回给我的c#?
- C#Selenium webdriver JavaScript错误记录
- 在IE8中可以点击带警报的已禁用按钮(Asp.net网站中的浏览器兼容性问题)
- JavaScript DI / IoC等同于静态类型语言的标准DI模式