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);
しかし、私はエラーが発生しました:
リモートサーバーがエラーを返しました:(405)メソッドは許可されていません。
更新:ここで、変数code
は認証コードです。
POSTリクエストを間違ったエンドポイントに送信していると思います。正しいエンドポイントはhttps://accounts.google.com/o/oauth2/token
Google認証の実装プロセスで同様の問題が発生したため、機能するコードを投稿します。最後に述べた問題:エラー(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
私のコードは機能しています。上記の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");
残りのコードは正しいです。
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
}
元のリクエストはやや古くなっているようです。しかし、Googleのコード例には、基本的な操作から分離するのが難しい「ベストプラクティス」のハウスキーピングコードがたくさん含まれていることがわかりました。
最近、すべてのREST操作をcurlコマンドとして表すドキュメントを公開しました。すべての言語に精通するのは難しいですが、curlは普遍的なようです。ほとんどの人はそれを知っています-そうでなければ、非常に簡単に把握できます。 。私のcurlの例では、-dフラグはPOST操作を示します。それ以外の場合、パラメーターはに追加されます。 URL。