3

主要問題:我該如何通過C#SDK爲60天訪問令牌擴展2小時訪問令牌?你能提供一個只有代碼已經交易2小時訪問令牌的部分樣本嗎?C#Facebook SDK將訪問令牌延長至60天

背景:我一直在這裏四處尋找並嘗試各種解決方案,還沒有找到一個適合我的工具。我可以成功地進行/ me調用,並獲得有關當前用戶的信息,但是當我嘗試擴展訪問令牌時失敗。

這個應用程序的目標是允許用戶設置一個帖子,並在一段時間後監控喜歡和評論。顯然,我們需要60天的代幣。

當您可以請求永久令牌時,在其他人完成了90%的工作後,我正在執行此項目。我的工作是修復它,以便我們可以使用60天的令牌。我可能會問非常愚蠢的後續問題。準備好!

當前流程:用戶設置他的帖子,點擊一個按鈕,我們提示他們通過javascript sdk授權我們的應用/登錄到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文檔。我已經看到包括重定向網址在內的人們說,當您最初獲得訪問權限時需要匹配那個網址,但我們在JavaScript中這樣做了,並且沒有使用重定向網址。 Dictionary參數2 =新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我得到同樣的錯誤作爲下一個方法...

不工作: 我是從另一個崗位抓起這裏複製/粘貼重命名以匹配我的變量。 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)無效的驗證碼格式}

+0

不幸的是,Facebook c#sdk很糟糕。我用它來做3個項目,讓我很後悔。 – DarthVader

回答

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; 
    } 
} 
+0

我會嘗試一下,但我很困惑你爲什麼使用HttpUtil來獲取令牌,而不是SDK FacebookClient.Get,我在其他地方見過嗎?我只是想了解其中的差異。 –

+0

我有遺留的代碼,並且使用我自己的方法使得它不需要處理任何數據類型,因爲令牌是作爲普通字符串返回的。 – HenryZhang

+0

你先生,真棒。非常感謝你。 –

0

How to renew Facebook access token using its C# SDK。只要求「oauth/access_token」是不夠的,你也必須在那裏指定參數。那裏的技術爲我工作。

+0

我通過參數變量的所有這些。這裏的區別是他們沒有使用重載並手動添加參數。這可能是他們的工作原理和我的工作原理不同的原因。 huandianz提出的解決方案目前正在爲我工​​作,我正在使用它。 –