0

ユーザーのカレンダーにアクセスするための認証コードを Google から取得したので、これをアクセス トークンと交換しようとしています。彼ら自身のドキュメントによると:

実際のリクエストは次のようになります。

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/v6xr77ewYqhvHSyW6UJ1w7jKwAzu&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

これにアクセスする私の試みは次のとおりです(C#):

string url = "https://accounts.google.com/o/oauth2/token";
WebRequest request = HttpWebRequest.Create(url); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 

string body = "code=<the_code_I_received>&\r\n"
    + "client_id=<my_client_id>&\r\n"
    + "client_secret=<my_client_secret>&\r\n"
    + "redirect_uri=http://localhost:4300\r\n"
    + "grant_type=authorization_code&\r\n"
                            ;
byte[] bodyBytes = Encoding.ASCII.GetBytes(body); 
request.ContentLength = bodyBytes.Length ; 
Stream bodyStream = request.GetRequestStream(); 
bodyStream.Write(bodyBytes, 0, bodyBytes.Length); 
bodyStream.Close(); 

try 
{
    request.GetResponse(); 

「http://localhost:4300」は、元のリクエストに入力したものとまったく同じです (そのポートで Web サーバーとしてリッスンしてコードを取得したため、有効でした) が、「http: //localhost' 念のため。

プロキシをnullに設定する(変更なし)、Acceptを変更する(そのヘッダーをWebリクエストに追加することは許可されていませんでした)など、いくつかの提案を試みました。

いずれの場合も、HTTP 400 - 不正なリクエストが返されます (try / catch が発生し、それを示す例外が発生します)。

/token の後にスラッシュを付けると (何でも試してみます!)、500 内部サーバー エラーが発生しました。

私が間違っていることは何か分かりますか?

4

1 に答える 1

0

本文に改行 \r\n が必要ですか? このコードは私のために働く...

var req0 = WebRequest.Create("https://accounts.google.com/o/oauth2/token");
req0.Method = "POST";
string postData = string.Format("code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type=authorization_code",
code, //the code i got back
"2xxx61.apps.googleusercontent.com", "XJxxxFy",
"http://localhost:1599/home/oauth2callback"); //my return URI

byte[] byteArray = Encoding.UTF8.GetBytes(postData);
req0.ContentType = "application/x-www-form-urlencoded";
req0.ContentLength = byteArray.Length;
using (Stream dataStream = req0.GetRequestStream())
{
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
}
try
{
using (WebResponse response = req0.GetResponse())
    {
    using (var dataStream = response.GetResponseStream())
        {    
        using (StreamReader reader = new StreamReader(dataStream))
        {
         string responseFromServer = reader.ReadToEnd();
         var ser = new JavaScriptSerializer();
            accessToken = ser.DeserializeObject(responseFromServer);
        }
    }
}
}
catch (WebException wex){ var x = wex; }
catch (Exception ex){var x = ex;}
于 2012-04-04T17:25:10.217 に答える