1

Я пытаюсь написать приложение YouTube для телефона Windows, и я наткнулся на некоторые проблемы на стороне аутентификации. По какой-то причине, следующий код не работает должным образом,Google OAuth2 Плохой запрос

string url = "https://accounts.google.com/o/oauth2/token?"; 
string postData = "code=" + str + "&client_id=*********.apps.googleusercontent.com&client_secret=*******&grant_type=authorization_code"; 


HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(url);    

byte[] data = Encoding.Unicode.GetBytes(postData); 
httpWReq.Method = "POST"; 
httpWReq.ContentType = "application/x-www-form-urlencoded";     

using (Stream stream =await httpWReq.GetRequestStreamAsync()) 
    stream.Write(data, 0, data.Length); 

HttpWebResponse response =(HttpWebResponse)(await httpWReq.GetResponseAsync()); 

string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

Я довольно новыми для HttpWebRequest так что, вероятно, я пропустил что-то, хотя я получаю ответ:

Bad Request

Конкретно это говорит о том, что grant_type отсутствует, хотя я уверен, что это не так, я сделал все в соответствии с документацией. Что я делаю не так ?

+1

Если вы запрашиваете разрешения пользователя, указываете ли вы «access_type = offline» в своем запросе? –

ответ

1

Это, вероятно, исправить это

  parameters.Append("code=" + str); 
      parameters.Append("&client_id=*****.apps.googleusercontent.com"); 
      parameters.Append("&client_secret=*****"); 
      parameters.Append("&redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto"); 
      parameters.Append("&grant_type=authorization_code"); 

      string p_params = parameters.ToString(); 
      byte[] p_data_params = Encoding.UTF8.GetBytes(p_params); 

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token"); 
      request.Accept = "application/json"; 
      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded"; 

      Stream dataStream = await request.GetRequestStreamAsync(); 
      dataStream.Write(p_data_params, 0, p_data_params.Length); 
      dataStream.Dispose(); 

      HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); 
      Stream responseStream = response.GetResponseStream(); 
      StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8); 
      string result = readStream.ReadToEnd(); 

отлично работает для меня.

+1

Так что в основном я просто пропустил запрос. Спасибо, это работает. –