【问题标题】:Error 401 requesting access token from Google with Oauth2使用 Oauth2 从 Google 请求访问令牌时出现错误 401
【发布时间】:2014-02-15 13:02:18
【问题描述】:

我正在编写一个需要访问 Google 任务 API 的 Java 客户端应用程序。我按照页面https://developers.google.com/accounts/docs/OAuth2InstalledApp 的说明进行操作,并设法获得了授权码。但是,当我尝试获取访问令牌时,我不断收到错误 400“错误请求”。

我正在使用 Firefox 的海报插件进行测试。我向https://accounts.google.com/o/oauth2/token 发送了一个帖子请求,内容为:

code=<the-code-i-got-in-step1>&
client_id=1097620474561-gusvm8cq428h86r7pcum285cuffssncj.apps.googleusercontent.com&
client_secret=,my-client-secret>&
redirect_uri=hurn:ietf:wg:oauth:2.0:oob&
grant_type=authorization_code

关于我可能做错的任何建议?

【问题讨论】:

  • 跟踪您的应用发送的实际 http。然后转到 Oauth Playground 并在那里执行等效步骤,注意 http 请求。比较两者。它可能就像对参数进行 URL 编码一样简单。
  • 我能够在 OAUTH 操场上完成,所以至少我可以看到成功响应的样子,但我仍然无法让自己的客户 ID 正常工作。不幸的是,我无法使用wireshark 跟踪HTTP 会话,因为它使用的是HTTPS。
  • 在 Oauth Playground 中,如果单击齿轮图标,您可以输入自己的客户端凭据。尝试一下,这样您就可以消除它是编码问题还是设置问题。

标签: java google-oauth google-oauth-java-client


【解决方案1】:

我终于明白了。我没有明确指定在初始请求代码时需要脱机访问,如此处所述invalid_grant trying to get oAuth token from google

感谢所有帮助我解决这个问题的人

【讨论】:

    【解决方案2】:

    如果是 400 错误(而不是 401 - 您的问题中提到了这两个代码),那么很可能请求格式不正确,请检查通用 HTTP 内容,例如:

    1. 确保它是 POST - 并且您将数据作为正文,而不是作为查询字符串。
    2. 内容长度已设置。
    3. Content-Type 设置为 application/x-www-form-urlencoded。
    4. 每个表单参数实际上都是 urlencoded

    我建议尽可能使用 Google 提供的客户端库,可以在此处找到已安装客户端应用程序的示例: https://code.google.com/p/google-api-java-client/wiki/OAuth2#Installed_Applications

    【讨论】:

    • 我肯定是在使用正文中的数据而不是作为查询字符串进行 POST。 content-type 设置为 application/x-www-form-urlencoded,Content-Length 由 Poster 插件自动设置。
    • 昨天我收到一个错误 401(对错误 400 的引用是一个错字),但是当我今天再次尝试时,我收到错误代码 404 - 未找到。
    • 我发现我没有正确地对我的参数之一进行 URL 编码。当我修复这个问题时,我仍然得到一个错误,但它是不同的。我得到 HTTP 代码 = 400 和 JSON 错误“无效授权”
    • 根据 breno 的上述评论 - 请尽可能多地粘贴原始请求(剥离客户端密码和任何访问/刷新令牌),包括所有标头以帮助我们调试。我注意到redirect_uri上面的“hurn:”而不是“urn:”......
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多