【问题标题】:Can't get a token from the Google API无法从 Google API 获取令牌
【发布时间】:2013-03-05 05:39:59
【问题描述】:

我正在尝试使用我的 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 等),我使用 Google API Playground 来查看哪种类型它执行的请求并将其与我自己的请求进行比较(除了返回 URL、身份验证代码和用户代理之外,找不到差异)。无论我做什么,我都无法让它工作,我已经被困了好几个小时了。

谁能帮帮我?

【问题讨论】:

  • 也许重定向 URI 是一个问题。你试过不同的吗?无论哪种方式,我的猜测是重定向时出现问题(您应该在某个时候得到 302,然后您将被重定向到导致 400 的新 URL)。检查您在 302 中收到的 URI(应该)在您收到 400 错误之前发生。

标签: authentication windows-8 windows-runtime google-api oauth-2.0


【解决方案1】:

读取正文内容以获取您在 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;

这是适合我的代码。应该也适合你。

【讨论】:

  • 感谢您的回答,但这不是我问题的答案。我想从 API 中获取令牌。
  • 对不起,试图帮助你的第一部分,使 Fiddler 不再需要。我知道那不是你的主要问题。在我的一个项目中找到了一些可以帮助您解决实际问题的代码。
  • 太棒了,您的更改成功了。我之前尝试过使用 UrlEncode 对不同的字段进行编码,但当时没有用。也许我编码了错误的字段,也许只是因为我没有为 StringContent 对象提供 UTF8 编码和 x-www-form-urlencoded 标头。谢谢!
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 2011-08-06
  • 2018-10-10
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多