首页 文章

C#Facebook SDK将accessstoken延长至60天

提问于
浏览
3

主要问题:我如何通过C#SDK扩展60天访问令牌的2小时访问令牌?您是否可以提供仅针对2小时访问令牌交换代码的部分的示例?

背景:我一直在这里寻找并尝试各种解决方案,但还没有找到适合我的方案 . 我可以成功地进行/我调用并获取有关当前用户的信息,但是当我尝试扩展访问令牌时,它失败了 .

此应用程序的目标是允许用户设置帖子并在事件发生后监视喜欢和评论一段时间 . 显然,我们需要60天令牌 .

当你可以申请永久令牌时,其他人完成了90%的工作后,我正在接受这个项目 . 我的工作是修复它,以便我们可以使用60天令牌 . 我可能会问非常愚蠢的后续问题 . 做好准备!

当前流程:用户设置他的帖子,点击一个按钮,我们提示他们通过javascript sdk授权我们的app /登录facebook . 在他们登录后,我们在javascript中处理其他无关的东西,然后将其AJAX转移到C#以将一些信息保存到我们的数据库(包括令牌)并发布帖子 . 一切都很好,我在javascript中获得访问令牌就好了,我可以使用那个2小时令牌获取登录用户的信息,但是当我尝试扩展时,我得到两个错误之一,我将在下面提到导致它们的代码 .

我尝试过的:

工作:我相信我在这里发现了另一篇文章 . var fbClient = new FacebookClient(accessToken);

Dictionary<string, object> parameters = new Dictionary<string, object>();
            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文档 . 我已经看到人们包括重定向网址,并说当你最初获得accessstoken时它需要匹配,但我们在javascript中做了这个并且没有使用重定向网址 . 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,我会得到与下一个方法相同的错误...

不工作:我从另一个帖子抓取这里复制/粘贴重命名以匹配我的vars . Unable to get long lived expiration token

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)验证码格式无效 . }

2 回答

  • 0

    How to renew Facebook access token using its C# SDK . 仅仅请求"oauth/access_token"是不够的,你也必须在那里指定参数 . 那里的技术对我有用 .

  • 6

    将以下代码与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;
        }
    }
    

相关问题