使用 oAuth 和 youtube 进行身份验证时,总是出现错误:invalid_grant on 2nd auth attempt,为啥?
Posted
技术标签:
【中文标题】使用 oAuth 和 youtube 进行身份验证时,总是出现错误:invalid_grant on 2nd auth attempt,为啥?【英文标题】:When authenticating with oAuth and youtube, always get error : invalid_grant on 2nd auth attempt, why?使用 oAuth 和 youtube 进行身份验证时,总是出现错误:invalid_grant on 2nd auth attempt,为什么? 【发布时间】:2012-01-16 01:35:57 【问题描述】:截至昨天,当我将 requestToken 交换为 accessToken 时,我的应用程序第一次可以通过 oAuth 2.0 向 google (youtube) 进行身份验证,但第二次(重新身份验证,相同的应用程序 + 相同的用户)没有问题我收到一个错误:
error : invalid_grant
我正在使用:
grant_type = authorization_code
就像他们建议的那样。在 2 天前之前发生的情况是,在重新进行身份验证时,网页会说“您之前已经通过此应用程序进行了身份验证,您想再次授予它访问权限吗?”。发生了什么变化或我做错了什么?
【问题讨论】:
我也有同样的问题,我正在尝试刷新令牌link 与此同时,我找到了解决方法。您可以将参数“approval_prompt=force”传递给授权网址,它会始终提示用户授权您的应用,即使他们过去已经授权过。所以他们永远不会得到“你之前已经授权过这个应用程序”页面,但显然那已经不再工作了。更多信息在这里:code.google.com/apis/accounts/docs/… 我们也遇到了这个问题。 【参考方案1】:我想我可能在这里找到了答案:
https://groups.google.com/forum/#!searchin/oauth2-dev/invalid_grant/oauth2-dev/eaOa6THER0k/z4eO-taUFxgJ
问题在于您需要发送的“代码”参数需要进行编码。当您将approval_prompt 设置为强制时,它将起作用,因为返回代码包含URL 安全字符。但是,第二次授权请求时的返回代码并非如此。
对我来说,这解决了它,我希望它也适用于你。
【讨论】:
没有人知道为什么 Google API 会通过 invalid_grant 错误。就我而言,代码对大多数用户来说都很好,但谷歌会为某些用户抛出 invalid_grant。 Google API 没有提供更好的解释。我查看了谷歌文档,没有明确的答案。【参考方案2】:我找到了解决此问题的方法(至少对我们而言)。当重定向到accounts.google.com/o/oauth2/auth url 时,我们必须同时添加approval_prompt=force 和access_type=offline。如果缺少一个,我们就没有刷新令牌。
此网址记录了所有参数,但没有说明刷新令牌:http://code.google.com/apis/accounts/docs/OAuth2WebServer.html
【讨论】:
哎呀,太残忍了,我没有注意到没有给出 refresh_token,我想知道用户对他们同意的“离线”通知会有什么反应:p 所以我得出了同样“残酷”的结论,现在我正在尝试将 refresh_token 换成新的grant_type=refresh_token
但我仍然遇到上述相同的错误。
所以据我了解...解决此问题的唯一方法是在用户每次想要登录您的应用程序时不断询问他们的权限???
不,我们不必每次都要求用户重新授权。我们将刷新令牌保存在我们的服务器上,并使用它在后台请求新的访问令牌。如果没有我上面描述的修复,YouTube 将停止向我们提供刷新令牌。以上是关于使用 oAuth 和 youtube 进行身份验证时,总是出现错误:invalid_grant on 2nd auth attempt,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
CodeIgniter-YouTube-API-Library 使用注册帐户进行身份验证
突然在 YouTube V3 API 上获得 Oauth 2.0 同意的 403(禁止)
如何从 Google YouTube Data API OAuth 2 iOS 获取刷新令牌