谷歌OAuth“error”:“invalid_grant”的响应,用于交换一次性授权代码以获取刷新和访问令牌的请求

3
我正在尝试使用此文档: Google Sign-In for server-side apps,为我们的服务器端应用程序实现Google登录。我已成功完成步骤1-6,并成功获取了一次性授权码。但是,在第7步中,当我请求交换一次性授权码以获取访问令牌时,我收到以下响应:
{
  "error": "invalid_grant",
  "error_description": "Bad Request"
}

我尝试使用CURL手动发送HTTP POST请求和官方的Python API客户端库。响应总是相同的"invalid_grant"。

在请求一次性授权码时,我确保请求离线访问模式。

我验证了为谁获取一次性授权码的用户确实已授予权限,方法是前往https://myaccount.google.com/u/0/permissions,并确保我们的应用程序在“具有帐户访问权限的第三方应用程序”中列出,并具有正确的访问范围。

请问如何调试此问题?不幸的是错误信息没有提供有用的提示,并且我已经尝试过在Stack Overflow或其他地方找到关于此特定错误的所有内容。

更新:我找出了问题所在。显然,一次性代码仅适用于一次请求,无论请求是否成功。因此,我试图获取刷新令牌,因为我的第一次尝试格式错误,请求失败,而第一次失败使一次性代码无效。任何随后的请求,即使正确形成一个,使用相同的代码也会失败并显示"invalid_grant"。这是一种令人意外的行为,我认为“一次性”意味着一次成功的尝试。 希望这对那些将在此基础上工作的其他人有所帮助。 我希望OAuth请求返回更多信息以帮助调试。


请编辑您的问题并包含您尝试过的代码。curl和python都可以。 - Linda Lawton - DaImTo
@DaImTo 感谢您的回复,我已经解决了我的问题,请查看更新。 - Tigran
请将您的更新发布为答案。您的问题和解决方案将帮助其他人。 - John Hanley
1个回答

8
我找出了问题所在。显然,一次性代码仅适用于一次请求,无论请求是否成功。因此,我试图获取刷新令牌,但由于我的第一次尝试格式不正确,请求失败,并且第一次失败会使一次性代码无效。任何后续请求,即使是正确形成的请求,使用相同的代码也会失败并显示“invalid_grant”。这是一种意外的行为,我原本以为“一次性”意味着一次成功的尝试。希望这对那些正在处理此问题的人有所帮助。希望OAuth请求返回更多信息以帮助调试。

我上周末遇到了这个确切的问题。你的答案瞬间浮现在脑海中。 - John Hanley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接