Как получить токен доступа для google oauth?

Я использую С# (ASP.NET). Я хочу использовать Google oauth для доступа к деталям профиля пользователя в своем приложении. Я успешно получил код авторизации, но имею проблему с получением токена доступа. Я предпочитаю учебные пособия Google. В учебнике я прочитал, что мне нужно отправить запрос и получить ответ от google. Для этого я использую System.Net.HttpWebRequest/HttpWebResponse (правильно ли я это делаю). Я использую этот код....

byte[] buffer = Encoding.ASCII.GetBytes("?code=" + code + "&client_id=xxx&client_secret=xxx&redirect_uri=xxxx&grant_type=authorization_code");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://accounts.google.com");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = buffer.Length;

Stream strm = req.GetRequestStream();
strm.Write(buffer, 0, buffer.Length);
strm.Close();

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Response.Write(((HttpWebResponse)resp).StatusDescription);

Но у меня есть ошибка:

Удаленный сервер возвратил ошибку: (405) Метод не разрешен.

Обновление: здесь переменная code является кодом авторизации.

Ответ 1

Я думаю, что вы отправляете запрос POST на неверную конечную точку, правильный - https://accounts.google.com/o/oauth2/token

Ответ 2

Поскольку у меня были аналогичные проблемы в процессе внедрения Google auth, я опубликую код, который будет работать. Последняя упомянутая проблема: error (400) Неверный запрос может быть вызван ведущими '?' в приведенном выше коде.

 string codeClient = "code="+ t +"&client_id=number.apps.googleusercontent.com&";
 string secretUri = "client_secret=yoursecret&" + "redirect_uri=path&"
      + "grant_type=authorization_code";
 postString = codeClient + secretUri;

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

 HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url.ToString());
 request.Method = "POST";
 request.ContentType = "application/x-www-form-urlencoded";

 UTF8Encoding utfenc = new UTF8Encoding();
 byte[] bytes = utfenc.GetBytes(postString);
 Stream os = null;
 try
 {
      request.ContentLength = bytes.Length;
      os = request.GetRequestStream();
      os.Write(bytes, 0, bytes.Length);
 }
 catch
 { }

 try
 {
      HttpWebResponse webResponse = (HttpWebResponse) request.GetResponse();
      Stream responseStream = webResponse.GetResponseStream();
      StreamReader responseStreamReader = new StreamReader(responseStream);
      result = responseStreamReader.ReadToEnd();//parse token from result

Ответ 3

Мой код работает, я допустил ошибки в двух строках. Это должно быть как

byte[] buffer = Encoding.ASCII.GetBytes("code=" + code + "&client_id=xxx&client_secret=xxx&redirect_uri=xxxx&grant_type=authorization_code");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token");

Оставшийся код верен.

Ответ 4

Оригинальный запрос кажется несколько устаревшим. Но я обнаружил, что примеры кода Google содержат большое количество кода "Best Practices", который трудно отделить от основных операций.

Недавно я опубликовал документ, который представляет все операции REST как команды curl. Трудно быть знакомым на каждом языке, но скручивание кажется универсальным. Большинство людей это знает, иначе это довольно легко понять. В моих примерах скручивания флаг -d указывает на операцию POST. В противном случае параметры добавляются к URL-адресу.

http://www.tqis.com/eloquency/googlecalendar.htm

Ответ 5

public string ReceiveTokenGmail(string code, string GoogleWebAppClientID, string GoogleWebAppClientSecret, string RedirectUrl)
{
    string postString = "code=" + code + "&client_id=" + GoogleWebAppClientID + @"&client_secret=" + GoogleWebAppClientSecret  + "&redirect_uri=" + RedirectUrl;

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

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url.ToString());
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";

    UTF8Encoding utfenc = new UTF8Encoding();
    byte[] bytes = utfenc.GetBytes(postString);
    Stream os = null;
    try
    {
        request.ContentLength = bytes.Length;
        os = request.GetRequestStream();
        os.Write(bytes, 0, bytes.Length);
    }
    catch
    { }
    string result = "";

    HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
    Stream responseStream = webResponse.GetResponseStream();
    StreamReader responseStreamReader = new StreamReader(responseStream);
    result = responseStreamReader.ReadToEnd();

    return result;
}

Ответ 6

Я попробовал аналогичный код, но возвращающ плохую реакцию. Может кто-нибудь помочь?

   string aoutcode = HttpContext.Request.Query["code"].ToString();

        string codeClient = "code=" + aoutcode + "&client_id=clientid&";
        string secretUri = "client_secret=clientsecret&" + "redirect_uri=https://localhost:44358/Home/token&"
             + "grant_type=authorization_code";
        string postString = codeClient + secretUri;
        string url = "https://accounts.google.com/o/oauth2/token";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url.ToString());
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";

        byte[] bytes = Encoding.ASCII.GetBytes(postString);

        Stream os = null;
        try
        {
            request.ContentLength = bytes.Length;
            os = request.GetRequestStream();
            os.Write(bytes, 0, bytes.Length);
        }

        catch
        { }

        try
        {
            HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
            Stream responseStream = webResponse.GetResponseStream();
            StreamReader responseStreamReader = new StreamReader(responseStream);
            string result = responseStreamReader.ReadToEnd();//parse token from result
        }