Ответ 1
Я думаю, что вы отправляете запрос POST на неверную конечную точку, правильный - https://accounts.google.com/o/oauth2/token
Я использую С# (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
является кодом авторизации.
Я думаю, что вы отправляете запрос POST на неверную конечную точку, правильный - https://accounts.google.com/o/oauth2/token
Поскольку у меня были аналогичные проблемы в процессе внедрения 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
Мой код работает, я допустил ошибки в двух строках. Это должно быть как
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");
Оставшийся код верен.
Оригинальный запрос кажется несколько устаревшим. Но я обнаружил, что примеры кода Google содержат большое количество кода "Best Practices", который трудно отделить от основных операций.
Недавно я опубликовал документ, который представляет все операции REST как команды curl. Трудно быть знакомым на каждом языке, но скручивание кажется универсальным. Большинство людей это знает, иначе это довольно легко понять. В моих примерах скручивания флаг -d указывает на операцию POST. В противном случае параметры добавляются к URL-адресу.
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;
}
Я попробовал аналогичный код, но возвращающ плохую реакцию. Может кто-нибудь помочь?
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
}