1

我使用 Google API PHP 客户端 ( http://code.google.com/p/google-api-php-client/ ) 发出 OAuth 请求 - 以获取新的访问令牌。

我已经缓存了刷新令牌并使用它来生成一个新的访问令牌。我已经阅读了文档(https://developers.google.com/accounts/docs/OAuth2https://developers.google.com/storage/docs/developer-guide),它只讨论了刷新的限制令牌(每个客户端/用户组合一个限制,所有客户端的每个用户另一个限制),但没有关于访问令牌限制的任何内容(除了访问令牌仅在一个小时内有效的事实)。

我正在尝试计算数千个存储桶的存储桶大小使用情况。我正在尝试并行化此任务以减少时间 - 我通过为每个存储桶生成一个新进程并且每个进程请求一个新的访问令牌来做到这一点。我这样做是因为我假设颁发的访问令牌的数量没有限制,并且因为对于具有大量对象的存储桶,计算时间 + 潜在的指数退避时间理论上可能会超过访问令牌的生命周期。

但是当我尝试这样做时,我看到了这个错误:

Error No: 1
Error on Line: 242
Error Message: Uncaught exception 'apiAuthException' with message 'Error refreshing the OAuth2 token, message: 
<HTML>
<HEAD>
<TITLE>User Rate Limit Exceeded</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>User Rate Limit Exceeded</H1>
<H2>Error 403</H2>
</BODY>
</HTML>

这是因为我产生了很多(目前 16 个)访问令牌吗?

如果不是,那么导致此错误的原因是什么?解决此错误的最佳方法是什么?

是否有记录用户速率限制的 Google 文档页面?

4

2 回答 2

7

基于刷新令牌的访问令牌没有限制。但是,可以请求访问令牌的速率是有限制的。您可以基于单个刷新令牌请求数千个访问令牌,它们都同时有效,但如果您超过几个 qps 的同时访问令牌请求,您将获得超过速率限制。

如上所述,单个 access_token 可以在多个请求中并行重用,如果它对所有这些请求都有效。

access_tokens 的限制没有公布,因为它们可能会发生变化。正确的客户端实现是进行指数退避以确保在存在速率限制更改时的正确性。但是,在您的情况下,由于所有令牌共享相同的范围和使用上下文,您应该能够成功地重用相同的令牌。

于 2013-05-07T01:44:12.313 回答
1

访问令牌的数量有限制。当您使用刷新令牌请求新的访问令牌时,它可能会覆盖先前分配的访问令牌,即使没有超过时间限制(是的,您一次可以激活的访问令牌的最大数量)。

此外,您可以使用刷新令牌请求新访问令牌的频率有一个速率限制。

解决此问题的最佳方法是拥有一个中央密钥管理流程,负责每 x 分钟获取一个新的访问令牌(例如,如果超时为一小时,则设为 30 分钟)。然后并行化进程从中央密钥管理进程请求单个访问令牌。

根据https://developers.google.com/accounts/docs/OAuth2

访问令牌的生命周期有限,在某些情况下,应用程序需要在单个访问令牌的生命周期之外访问 Google API。在这种情况下,您的应用程序可以获得所谓的刷新令牌。刷新令牌允许您的应用程序获取新的访问令牌。

请注意,将发行的刷新令牌的数量是有限制的;每个客户端/用户组合一个限制,所有客户端的每个用户另一个限制。您应该将刷新令牌保存在长期存储中,并在它们保持有效时继续使用它们。如果您的应用程序请求太多刷新令牌,它可能会遇到这些限制,在这种情况下,较旧的刷新令牌将停止工作。

于 2013-05-04T06:36:49.450 回答