无法从谷歌 API 获取令牌



我正试图用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;

这是为我工作的代码。

相关内容

  • 没有找到相关文章

最新更新