2012-05-22 91 views
1

我對這個OAuth2的東西做得很好,直到我嘗試獲取該令牌。.Net Google OAuth令牌WebRequest錯誤的請求協議錯誤

我想我正在做的事情與編碼。

這裏是我的代碼:

string url = "https://accounts.google.com/o/oauth2/token"; 

StringBuilder postDataBuider = new StringBuilder(); 
postDataBuider.AppendLine("code=" + code); 
postDataBuider.AppendLine("client_id=" + System.Configuration.ConfigurationManager.AppSettings["GoogleApplicationClientId"].ToString()); 
postDataBuider.AppendLine("client_secret=" + System.Configuration.ConfigurationManager.AppSettings["GoogleApplicationClientSecret"].ToString()); 
postDataBuider.AppendLine("redirect_uri=" + System.Configuration.ConfigurationManager.AppSettings["AppDomain"] + "Account/YouTubeOAuth2Callback"); 
postDataBuider.AppendLine("grant_type=authorization_code"); 

string postDataStr = postDataBuider.ToString(); 
// byte[] postDataBytes = System.Text.Encoding.GetEncoding("application/x-www-form-urlencoded").GetBytes(postDataStr); 
byte[] postDataBytes = System.Text.Encoding.UTF8.GetBytes(postDataStr); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Accept = "application/json"; 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = postDataBytes.Length; 

Stream dataStream = request.GetRequestStream(); 
dataStream.Write(postDataBytes, 0, postDataBytes.Length); 
dataStream.Close(); 

string responseStr = ""; 

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    using (Stream responseStream = response.GetResponseStream()) 
    { 
     using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8)) 
     { 
      responseStr = readStream.ReadToEnd(); 

      if (String.IsNullOrWhiteSpace(responseStr)) 
      { 
       throw new Exception("Response is null or empty"); 
      } 
     } 
    } 
} 

這裏是我記錄有關錯誤的信息:

The remote server returned an error: (400) Bad Request. 

Response Status: ProtocolError 
Response Header: Cache-Control = no-cache, no-store, max-age=0, must-revalidate 
Response Header: Pragma = no-cache 
Response Header: Expires = Fri, 01 Jan 1990 00:00:00 GMT 
Response Header: Date = Tue, 22 May 2012 05:55:54 GMT 
Response Header: Content-Type = application/json 
Response Header: X-Content-Type-Options = nosniff 
Response Header: X-Frame-Options = SAMEORIGIN 
Response Header: X-XSS-Protection = 1; mode=block 
Response Header: Server = GSE 
Response Header: Transfer-Encoding = chunked 

回答

2

我不知道,如果你仍然面臨這個問題,但你請求體應在同一條線上(爲StringBuilder.Append改變StringBuilder.AppendLine),以及由「&」分離的參數:

StringBuilder postDataBuider = new StringBuilder(); 
postDataBuider.Append("code=" + this.code.Text); 
postDataBuider.Append("&client_id=" + clientId); 
postDataBuider.Append("&client_secret=" + clientSecret); 
postDataBuider.Append("&redirect_uri=" + redirectUri); 
postDataBuider.Append("&grant_type=authorization_code"); 

這些更改後,您的代碼工作得很好,並返回訪問令牌。

+0

謝謝Ezequiel – Dudeman3000

+0

我曾試過這個,但它仍然失敗。使用小提琴手和使用郵差比較一個成功的職位,意識到我的客戶祕密有一個「+」號,它在發佈時被解碼爲空間。解決方案是UrlEncode客戶端密碼。這爲我修好了。 –

相關問題