Вопрос по c#, asp.net, google-api, oauth-2.0 – Как получить токен доступа для Google OAUT?

11

Я использую C # (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);

Но я получил ошибку:

The remote server returned an error: (405) Method Not Allowed.

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

Почему вы не используетеcode.google.com/p/google-api-dotnet-client/wiki/OAuth2 user854301
@ user854301 Я могу сослаться на это, но я хотел знать, что использованиеHttpWebRequest/Response  правильно или нет? Могу ли я отправить запрос в Google изHttpWebRequest. Sagar
Что такое "код" в твоем буфере ?? Apoorva
Как получить код авторизации ... подскажите, пожалуйста, я не знаю об этом .. user4736499
@Apoorva Это код авторизации. Sagar

Ваш Ответ

6   ответов
8

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

Я использую это, но это показывает мне другую ошибку. Теперь ошибкаThe remote server returned an error: (400) Bad Request. Куда я иду не так? Sagar
Подробная информация об исключении, полное сообщение об ошибке скажет вам, что не так с вашим запросом
0

но он дал неверный ответ. Может кто-нибудь помочь?

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

что примеры кода Google содержат множество «Best Practices» служебный кодекс, который трудно отделить от основных операций.

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

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

0
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;
}
Как я могу получить код аутентификации от Google ?. Я хотел использовать ваш код, поэтому мне не нужно использовать файл key.json и просто использовать конфигурацию приложения для моего идентификатора клиента и секрета клиента. Если бы вы могли поделиться, как получить код авторизации, это было бы здорово.
2

я сделал ошибки в двух строчках выше. Так должно быть

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");

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

Что такое переменная Code в вашем коде?
@Viktor: я замечаю твоиclient id а такжеclient secret оба включены в буфер. Мой размещенный сайт не имеет SSL. Знаете ли вы, если Google примет мой веб-запрос от соединения без SSL? Очевидно, это было бы небезопасно, и кто-то мог бы поднять мои учетные данные, но я не знаю, как это обойти.
4

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

 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
что такое "т" используется для кода .. и как его получить ..
т начальный код авторизации ...
спасибо, похоже, сейчас работает нормально.
@Sahil, убедитесь, что URL-адрес oauth является правильным. Обратите внимание, что я использовал этот фрагмент кода почти 5 лет назад.
Это все еще говорит, что Bad Request с этим кодом также

Похожие вопросы