web-dev-qa-db-ja.com

Google OAuthのアクセストークンを取得するにはどうすればよいですか?

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

11
Sagar

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

8

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
4
Neno

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

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

2
Sagar
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;
}
0
Sahil Bhatia

同様のコードを試しましたが、応答が悪くなりました。誰かが助けることができますか?

   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
Uttam

元のリクエストはやや古くなっているようです。しかし、Googleのコード例には、基本的な操作から分離するのが難しい「ベストプラクティス」のハウスキーピングコードがたくさん含まれていることがわかりました。

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

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

0
Sunny Jim