我正试图用Google OAuth2 API为我的Windows 8应用程序交换我的授权代码令牌,但我一直得到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等),我使用Google API Playground来查看它执行什么样的请求,并将其与我自己的请求进行比较(除了返回URL,验证码和用户代理之外找不到差异)。不管我怎么做,我就是无法使它工作,我已经被卡住好几个小时了。
谁能帮我一下吗?读取主体内容以获取您在Fiddler中注意到的错误json。
HttpClient httpClient = new HttpClient();
var response = httpClient.PostAsync(new Uri(url), new StringContent(body)).Result;
var content = response.Content.ReadAsStringAsync().Result;
content现在保存:
{
"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;
这是为我工作的代码。