2012-05-22 3 views
1

토큰을 가져 오기 전까지이 OAuth2 항목으로 문제가 없습니다..Net Google OAuth token 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

나는 이것을 시도했지만 여전히 실패했습니다. 피 들러를 사용하고 Postman을 사용하여 성공적인 게시물을 비교하면 내 고객의 비밀에 "+"기호가 있고 게시 할 때 공간으로 디코딩되는 것을 알게됩니다. 해결책은 클라이언트 비밀 번호를 UrlEncode하는 것이 었습니다. 그것을 위해 그것을 고정. –

관련 문제