invalid_grant试图从谷歌获取oAuth令牌

And*_*ira 105 google-api

invalid_grant尝试从Google获取oAuth令牌以连接到他们的联系人api时,我一直收到错误消息.所有的信息都是正确的,我已经检查过这么难过了.

有谁知道可能导致这个问题的原因?我已经尝试为它设置不同的客户端ID,但我得到相同的结果,我尝试连接许多不同的方式,包括尝试强制验证,但仍然是相同的结果.

aro*_*oth 62

尽管access_type按照bonkydog的回答在我的请求中指定了"离线" ,但我遇到了同样的问题.长话短说我发现这里描述的解决方案对我有用:

https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs

实质上,当您在Google API控制台中添加OAuth2客户端时,Google会为您提供"客户端ID"和"电子邮件地址"(假设您选择"webapp"作为您的客户端类型).尽管Google有误导性的命名惯例,但他们希望您client_id在访问OAuth2 API时将"电子邮件地址"作为参数的值发送.

调用这两个URL时都适用:

请注意,如果您使用"客户ID"而不是"电子邮件地址"来调用第一个URL,则会成功调用.但是,尝试从第二个URL获取持有者令牌时,使用从该请求返回的代码将不起作用.相反,您将收到"错误400"和"invalid_grant"消息.

  • 绝对荒谬:特别是如果你得到一个初始刷新令牌它与client_id一起工作的部分.Googles API及其文档很乱. (53认同)
  • 用用户的电子邮件替换 `client_id` 会产生 `invalid_client` 错误。这个答案似乎过时了。 (10认同)
  • 我在这个问题上敲了很长时间.我从没想过'client_id'不是'client_id'字段的预期.除了偶尔你获得refresh_token的时候,它确实有效.很确定我现在对谷歌的话语不能说是在SO上. (6认同)
  • 你好..我无法找到你们正在谈论的"电子邮件"地址.这就是我在我的控制台中所拥有的 - > https://pbs.twimg.com/media/CVVcEBWUwAAIiCy.png:large (4认同)
  • 电子邮件地址在哪里?我有同样的问题 (4认同)
  • 永远不要相信Google文档.最可靠的文档和API来自Google,这是世界上最有价值的公司.我不得不花费无数个小时来使用Google API.问题之后出现问题,然后他们自己的.Net库因不同的依赖性问题而不能编译不同的API.该代码现在适用于大多数用户,但对于某些用户,我仍然得到invalid_grant,invalid_credentials等,没有特别的原因. (4认同)

bon*_*dog 55

当我将用户发送到OAuth时没有明确请求"离线"访问时,我遇到了这个问题"你想让这个应用程序获得触摸你的东西的权限吗?" 页.

确保在请求中指定access_type = offline.

详情请访问:https://developers.google.com/accounts/docs/OAuth2WebServer#offline

(另外:我认为Google在2011年末添加了此限制.如果您之前有旧令牌,则需要将用户发送到权限页面以授权离线使用.)

  • @Adders 我同意。我将`access_type`设置为`offline`,这个错误仍然发生。 (12认同)

laa*_*der 50

虽然这是一个老问题,但似乎许多人仍然遇到它 - 我们花了几天时间跟踪这个问题.

在OAuth2规范中,"invalid_grant"对于与无效/过期/撤销令牌(auth grant或刷新令牌)相关的所有错误都是一种包罗万象.

对我们来说,问题是双重的:

  1. 用户已经积极撤销对我们应用的访问权限
    有道理,但得到这个:撤销后12小时,Google停止在他们的回复中发送错误消息: “error_description” : “Token has been revoked.”
    这是相当误导的,因为你会认为错误消息始终存在,而不是案子.您可以在应用权限页面检查您的应用是否仍然具有访问权限.

  2. 用户已重置/恢复其Google密码
    2015年12月,Google更改了其默认行为,以便非Google Apps用户重置密码会自动撤消所有用户的应用刷新令牌.在撤销时,错误消息遵循与之前情况相同的规则,因此您只能在前12个小时内获得"error_description".似乎没有任何方法可以知道用户是否手动撤销了访问(有意)或由于密码重置(副作用)而发生了访问.

除此之外,还有无数其他可能导致错误的潜在原因:

  1. 服务器时钟/时间不同步
  2. 未授权进行离线访问
  3. 受到谷歌的限制
  4. 使用过期的刷新令牌
  5. 用户已停用6个月
  6. 使用服务工作者电子邮件而不是客户端ID
  7. 在短时间内访问令牌太多
  8. 客户端SDK可能已过时
  9. 刷新令牌不正确/不完整

我写了一篇简短的文章,总结了每个项目,并提供了一些调试指导,以帮助找到罪魁祸首.希望能帮助到你.

  • 另一种情况是,如果您尝试从相同的身份验证代码多次获取令牌。 (17认同)

Jas*_*ana 11

如果您正在邮递员 / insomnia 中对此进行测试,并且只是想使其正常工作,请提示:服务器身份验证代码(代码参数)仅适用一次。这意味着如果您在请求中填充任何其他参数并返回 400,您将需要使用新的服务器身份验证代码,否则您将获得另一个 400。

  • 在找到这个答案之前无数次尝试相同的代码。你救了我的命。奇怪的是这个答案没有显示在顶部。我需要向下滚动才能找到这个。 (16认同)
  • 这学起来很痛苦,而且在 Google 文档中没有表现得更明显……至少令人失望。 (2认同)

Kev*_*phy 9

我们尝试了很多方法,最终问题是客户在其 Google 帐户设置中关闭了“不太安全的应用程序访问”。

要打开此功能:

  1. 前往https://myaccount.google.com/并管理帐户
  2. 转到安全选项卡
  3. 开启不太安全的应用程序访问

在此输入图像描述

我希望这可以节省一些人的时间!


Ton*_* Vu 7

我遇到了同样的问题.对我来说,我通过使用电子邮件地址(以... @ developer.gserviceaccount.com结尾的字符串)而不是client_id参数值的客户端ID来修复此问题.Google的命名设置令人困惑.

  • 这是@aroth一年多前给出的答案 (5认同)

Bra*_*Lee 6

我的问题是我使用了这个 URL:

https://accounts.google.com/o/oauth2/token
Run Code Online (Sandbox Code Playgroud)

当我应该使用这个 URL 时:

https://www.googleapis.com/oauth2/v4/token
Run Code Online (Sandbox Code Playgroud)

这是测试一个想要离线访问存储引擎的服务帐户。


pau*_*aul 6

这是一个愚蠢的答案,但对我来说问题是我没有意识到我已经为我的谷歌用户颁发了一个有效的 oAuth 令牌,但我未能存储它。这种情况的解决方案是转到 api 控制台并重置客户端密钥。

对此还有许多其他答案,例如 Reset Client Secret OAuth2 - Do client need to re-grant access?


Alb*_*rtS 5

通过在 Google 控制台中删除该项目的所有授权重定向 URI 来解决。当您使用“postmessage”作为重定向 URI 时,我使用服务器端流