我在很多问题中都看到了这个问题,但到目前为止,似乎没有一个适用于我的情况。
我们遇到的问题是,当我们试图获得访问令牌时,我们正在获得"invalid_grant"错误。这只发生在某些帐户上,但是当它发生时,在我观察的每种情况下,刷新令牌之前都是有效的,现在已经停止工作了。这种情况发生得太频繁了,以至于客户撤销了访问权限(在过去几周内,我们管理的近20%的渠道已经失效)。
值得注意的是,我们有一个后端流程,可以将视频上传到客户的YouTube频道。
-
我们使用OAuth2来获取刷新令牌,下面是我们发送的参数…
scope = "https://www.googleapis.com/auth/youtube",Client_id = ",Response_type = "code",Access_type = "offline",Approval_prompt = "force",redirect_uri = "http://www.us.com/OAuth/YouTube"
注意:对于client_id,我们使用的电子邮件地址是在谷歌API管理器(或者是,我只是看了看,它不再存在)。我们曾经使用这个页面中的客户端ID,但这也给我们带来了问题。这种情况改变了吗?我们现在应该使用这个页面的客户端ID吗?
-
我们将返回的代码交换为刷新和访问令牌,并将刷新令牌存储在数据库中。
-
后端进程将刷新令牌交换为访问令牌,这就是我们似乎得到"invalid_grant"错误的地方。
保证在任何时候只有一个通道访问令牌在使用(25个限制不适用)。我们不存储访问令牌,我们每次处理一个频道都会得到一个新的。
你知道会发生什么吗?要找的东西?参见上面关于客户端ID的说明。这可能与它有关,但我犹豫是否要尝试,因为以前使用API管理器的"客户端ID"会导致问题。
保证在任何时候只有一个通道访问令牌在使用(25个限制不适用)。我们不存储访问令牌,我们每次处理一个频道都会得到一个新的。
这个语句是不正确的:访问令牌可以根据需要多次使用,而它们仍然有效(一个小时)。
答:
"invalid_grant"基本上意味着刷新令牌不再工作。解决这个问题的唯一办法是再次请求访问并获得一个新的访问权限。问题应该是,它为什么要过期。
假设用户没有撤销访问权限,并且刷新令牌已在过去六个月内用于请求新的访问令牌。这可能是一个问题,它被重写。
当用户验证您的应用程序时,您将获得一个刷新令牌。这个刷新令牌与应用程序的客户端id和刚刚通过身份验证的用户相关联。如果该用户再次验证您的应用程序,您将获得另一个刷新令牌。这个刷新令牌同样与用户和您的项目客户端id相关联。这两个刷新令牌都可以工作。你的用户可以一直这样做到25(注意,我认为最近更改为50,但我还没有测试过所有的api),一旦他们达到这个神奇的数字,第一个刷新令牌将过期,如果你尝试使用它,你会得到一个无效的授权。
唯一的解决方案就是再次请求身份验证。务必始终保存用户授予应用程序的最新刷新令牌。如果(像我一样)您的应用程序存储在许多需要身份验证的服务器上。你必须告诉他们不要刷新太多次,否则他们将不得不回去重新验证他们过期的第一个。
如果您的所有请求都发生了这种情况。您还可以检查您的服务器是否与NTP同步,并且您正在post字段中发送请求的有效负载。没有像HTTP GET那样附加到身份验证端点(已经这样做了)。
以下是令牌停止工作并失效的可能原因:
- 用户已撤销访问权限。
- 该令牌已六个月未使用。
- 用户更改密码,令牌包含Gmail范围
- 用户的令牌请求数已超过一定数量。
如您所见,不建议您每次处理通道时都请求一个新的通道。正如令牌过期中所提到的:
如果您需要授权多个程序、机器或设备,一个解决方法是将每个用户帐户授权的客户端数量限制为15或20。如果你是Google Apps管理员,你可以创建额外的管理员用户,并使用他们来授权一些客户端。
关于client_ID
的使用,通常需要调用在创建Google API控制台项目和客户端ID中提到的登录API。
最后,这个Google Groups讨论- OAuth 2.0 400 - error:invalid_grant And ideas?可能也有帮助。