1

Windows 8 アプリ用の Google OAuth2 API を使用して認証コードをトークンに交換しようとしていますが、HTTP 400 エラーが発生し続けます。

これは私がリクエストを実行する方法です(簡略化):

var url = "https://accounts.google.com/o/oauth2/token";
var body = "code=4/LEXF1iAVRZvfCfdQg9r1aFqoYDgV&client_id=904019870963.apps.googleusercontent.com&client_secret=[removed]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code";

HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.PostAsync(new Uri(url), new StringContent(body));

response.EnsureSuccessStatusCode();

通常、Visual Studio では単純に HTTP 400 の不正な要求エラーが返されます。Fiddler で同じことを試みると、HTTP 400 エラーも表示されますが、これはコンテンツとして次のとおりです。

21
{
  "error" : "invalid_request"
}
0

Google OAuth に関するすべてのドキュメントを読み、Google と StackOverflow でこの問題を検索し、コード内のさまざまな種類のもの (UrlEncode など) をすべて変更してみました。それを実行し、自分のリクエストと比較しました(戻りURL、認証コード、およびユーザーエージェントを除いて違いは見つかりませんでした)。何をしても、これを機能させることができません。すでに何時間も立ち往生しています。

誰か助けてくれませんか?

4

1 に答える 1

5

本文の内容を読んで、Fiddler で気付いたエラー json を取得します。

HttpClient httpClient = new HttpClient();
var response = httpClient.PostAsync(new Uri(url), new StringContent(body)).Result;
var content = response.Content.ReadAsStringAsync().Result;

コンテンツが保持されるようになりました:

{
  "error" : "invalid_request"
}

response.Content.ReadAsAsync().Result のようにエラーの種類を指定することで、オブジェクトにエラーを投影できます。

無効なリクエスト部分については、UrlEncode で遊ぶ必要があります。試してみたと言うのは知っていますが、適切な場所に適用すると、問題が本当に解決します.

var body = "code="+WebUtility.UrlEncode("4/LEXF1iAVRZvfCfdQg9r1aFqoYDgV")+
           "&redirect_uri="+WebUtility.UrlEncode("https://yoursite...")+
           "&client_id=904019870963.apps.googleusercontent.com" +
           "&scope=" +
           "&client_secret=********" +
           "&grant_type=authorization_code";

HttpClient httpClient = new HttpClient();
var response = httpClient.PostAsync(new Uri(endpoint), 
    new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded")).Result;

これは私のために働くコードです。あなたのためにも働くはずです。

于 2013-03-16T15:16:55.770 に答える