我正在尝试使用以下文档为我们的服务器端应用程序实现Google登录: Google Sign-In for server-side apps
我成功地遵循了步骤1-6,并且能够获得一次性身份验证代码。但是,在第7步中,当我请求交换访问令牌的一次性身份验证代码时,我得到一个响应:
{
"error": "invalid_grant",
"error_description": "Bad Request"
}
我尝试了使用CURL进行手动HTTP POST请求,还尝试了官方api客户端Python库。响应始终是相同的“ invalid_grant
”。
在请求一次性身份验证码时,我确保请求了离线访问模式。
我通过访问https://myaccount.google.com/u/0/permissions并确保我们的应用已在“具有帐户访问权限的第三方应用”中列出,确认我获得了一次身份验证代码的用户确实已授予访问权限范围。
可以请教如何调试吗?不幸的是,该错误消息没有帮助,我已经尝试过在堆栈溢出或其他地方找到的关于此特定错误的所有信息。
更新:我知道了问题所在。显然,一次性代码仅对一个请求有效,无论请求成功与否。因此,我试图获取刷新令牌,并且因为我的第一次尝试格式错误,所以请求失败,并且第一次失败使一次性代码无效。使用此相同代码的任何后续请求,即使格式正确,也将失败,并显示“ invalid_grant”。这有点出乎意料,我给人的印象是“一次”意味着一次成功的尝试。 希望这对其他将对此有所帮助的人有所帮助。 我使用OAuth请求返回了更多有用的错误消息,以帮助进行调试。
答案 0 :(得分:1)
我弄清楚了问题所在。显然,一次性代码仅对一个请求有效,无论请求成功与否。因此,我试图获取刷新令牌,并且因为我的第一次尝试格式错误,所以请求失败,并且第一次失败使一次性代码无效。使用此相同代码的任何后续请求,即使格式正确,也将失败,并显示“ invalid_grant”。这有点出乎意料,我给人的印象是“一次”意味着一次成功的尝试。希望这对其他将对此有所帮助的人有所帮助。我使用OAuth请求返回了更多有用的错误消息,以帮助进行调试。
答案 1 :(得分:-1)
我们遇到了同样的问题并尝试了很多方法,最终问题是客户在其 Google 帐户设置中关闭了“安全性较低的应用访问”。
要开启此功能:
我希望这可以为某人节省一些时间!