11

C# (ASP.NET) を使用しています。アプリでユーザー プロファイルの詳細にアクセスするために Google OAuth を使用したいと考えています。認証コードは取得できましたが、アクセス トークンの取得に問題があります。私はGoogle チュートリアルの方が好きです。チュートリアルでは、リクエストを送信して Google からのレスポンスを取得する必要があることを読みました。そのために、私はSystem.Net.HttpWebRequest/HttpWebResponse(am I going in the right way) を使用します。私はこのコードを使用しました...

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は認証コードです。

4

5 に答える 5

8

POST リクエストを間違ったエンドポイントに送信していると思います。正しいエンドポイントはhttps://accounts.google.com/o/oauth2/token

于 2012-08-06T20:05:14.763 に答える
4

Google認証を実装する過程で同様の問題があったので、動作するコードを投稿します.. 上記のコードで..

 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
于 2012-09-18T20:05:14.393 に答える
2

私のコードは機能しています。上記の 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");

残りのコードは正しいです。

于 2012-09-21T08:08:08.137 に答える
0

元のリクエストはやや時代遅れのようです。しかし、Google のコード例には、重要な操作から分離するのが難しい「ベスト プラクティス」のハウスキーピング コードが多数含まれていることがわかりました。

私は最近、すべての REST 操作を curl コマンドとして表すドキュメントを公開しました。すべての言語に精通するのは難しいですが、curl は普遍的なようです。ほとんどの人はそれを知っています-そうでなければ、それを理解するのはとても簡単です. 私の curl の例では、-dフラグは POST 操作を示しています。それ以外の場合、パラメーターは URL に追加されます。

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

于 2013-01-05T20:17:59.087 に答える