我在很多问题中都看到了这个问题,但到目前为止,似乎都没有适用于我的情况。
我们遇到的问题是我们得到了一个" invalid_grant"我们尝试获取访问令牌时出错。这只发生在某些帐户中,但是当它确实发生时,在我查看的每种情况下,刷新令牌都在之前工作,现在已经停止工作。这种情况经常发生,因为它是客户撤销访问权限(似乎在过去几周我们管理的渠道中有近20%已经失效)。
作为备注,我们有一个后端流程,可将视频上传到客户的YouTube频道。
我们使用OAuth2获取刷新令牌,以下是我们发送的参数...
范围=" https://www.googleapis.com/auth/youtube", client_id ="", response_type =" code", access_type ="离线", approval_prompt =" force", redirect_uri =" http://www.us.com/OAuth/YouTube"
注意:对于client_id,我们使用Google API管理器中的电子邮件地址(或者,我只是看了,它已经不存在了)。我们过去常常使用此页面中的客户端ID,但这也导致了我们的问题。这改变了吗?我们现在应该使用此页面中的客户端ID吗?
我们交换为刷新和访问令牌返回的代码,并将刷新令牌存储在我们的数据库中。
后端进程交换访问令牌的刷新令牌,这就是我们似乎正在获取" invalid_grant"错误。
保证在任何时候只使用该频道的单个访问令牌(25限制不适用)。我们不存储访问令牌,每次处理频道时我们都会获得一个新的访问令牌。
任何想法可能会发生什么?有什么要找的吗?请参阅上面有关客户端ID的说明这可能与它有关,但是由于使用了"客户端ID"我会犹豫不决。来自API管理员之前引发了问题。
答案 0 :(得分:0)
以下是令牌停止工作并变为无效的可能原因:
正如您所看到的,建议您不要在每次处理频道时请求新的频道。正如Token expiration中提到的那样:
如果您需要授权多个程序,计算机或设备,一种解决方法是将每个用户帐户授权的客户端数量限制为15或20.如果您是Google Apps管理员,则可以创建其他管理员用户并使用它们来授权一些客户。
关于client_ID
的使用,通常需要调用Creating a Google API Console project and client ID中提到的登录API。
最后,Google网上论坛讨论 - OAuth 2.0 400 - error:invalid_grant and ideas?也可能有所帮助。
答案 1 :(得分:0)
保证在任何时候只使用该频道的单个访问令牌(25限制不适用)。我们不存储访问令牌,每次处理频道时我们都会获得一个新的访问令牌。
此声明不正确:访问令牌可以在您仍然良好(一小时)时根据需要多次使用。
答案:
“invalid_grant”基本上意味着您的刷新令牌不再有效。解决该问题的唯一方法是再次请求访问并获取新的访问权限。问题应该是为什么它首先到期。
假设用户未撤销访问权限,并且在过去六个月内已使用刷新令牌请求新的访问令牌。这可能是一个过度编写的问题。
当用户验证您的应用程序时,您将获得一个刷新令牌。此刷新令牌与应用程序的客户端ID和刚刚进行身份验证的用户相关联。如果所述用户再次验证您的应用程序,您将获得另一个刷新令牌。此刷新令牌再次与用户和您的项目客户端ID相关联。这两个刷新令牌都可以使用。你的用户最多可以继续这样做25(注意我认为它最近改为50但我还没有测试过所有的API)一旦他们达到了这个神奇的数字,第一个刷新令牌就会过期,如果你尝试使用它它会得到无效的补助金。
唯一的解决方案是再次请求身份验证。始终保存用户已授予应用程序的最新刷新令牌非常重要。在事件中(像我一样),您有一个应用程序存储在许多需要身份验证的服务器上。你必须告诉他们不要多次刷新它们,否则他们将不得不返回并重新验证他们过期的第一个。
如果您的所有请求都发生这种情况。您还可以检查服务器是否与(NTP)同步,以及您是否在帖子字段中发送请求的有效负载。没有像HTTP GET那样附加到身份验证端点(已经完成了)。