我使用Google API PHP客户端(http://code.google.com/p/google-api-php-client/)发出OAuth请求 - 获取新的访问令牌。
我已缓存刷新令牌并使用它来生成新的访问令牌。我已经查看了文档(https://developers.google.com/accounts/docs/OAuth2,https://developers.google.com/storage/docs/developer-guide),它只讨论了刷新令牌的限制(每个客户端/用户组合一个限制,所有客户端的每个用户另一个限制)但没有关于Access的内容令牌限制(访问令牌仅在一小时内有效)。
我正在尝试计算数千个存储桶中的存储桶大小使用情况。我正在尝试并行化此任务以减少时间 - 我通过为每个存储桶生成一个新进程来执行此操作,并且每个进程都请求一个新的访问令牌。我这样做是因为我假设发出的访问令牌数量没有限制,因为对于有大量和大量对象的存储桶,计算时间+潜在的指数退避时间理论上可能会超过访问令牌的生命周期。
但是当我尝试这样做时,我看到了这个错误:
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>
这是因为我在Access Tokens中产生了很多(目前只有16个)吗?
如果没有,那么是什么导致了这个错误?什么是解决此错误的最佳方法?
是否有记录用户速率限制的Google文档页面?
答案 0 :(得分:7)
基于刷新令牌对访问令牌没有限制。但是, rate 的限制可以请求访问令牌。您可以根据单个刷新令牌请求数千个访问令牌,它们同时有效,但如果您超过几个qps的同时访问令牌请求,您将获得超出限制率。
如上所述,如果一个access_token对所有这些请求都有效,则可以在多个请求中并行重复使用。
access_tokens的限制不会发布,因为它们可能会发生变化。正确的客户端实现是参与指数退避以确保在存在速率限制变化时的正确性。但是,在您的情况下,由于所有令牌共享相同的范围和使用上下文,您应该能够成功地重复使用相同的令牌。
答案 1 :(得分:1)
访问令牌的数量有限制。当您使用刷新令牌请求新的访问令牌时,它可能会覆盖先前分配的访问令牌,即使未超过时间限制(是的,您可以一次激活最大数量的访问令牌)。
此外,对使用刷新令牌请求新访问令牌的频率有一个速率限制。
解决此问题的最佳方法是建立一个中央密钥管理流程,负责每隔x分钟获取一个新的访问令牌(如果超时为一小时,则为30分钟)。然后,并行化的进程从中央密钥管理进程请求单一访问令牌。
根据https://developers.google.com/accounts/docs/OAuth2:
访问令牌的生命周期有限,在某些情况下,应用程序需要在单个访问令牌的生命周期之外访问Google API。在这种情况下,您的应用程序可以获得所谓的刷新令牌。刷新令牌允许您的应用程序获取新的访问令牌。
请注意,将发布的刷新令牌数量有限制;每个客户端/用户组合一个限制,所有客户端的每个用户另一个限制。您应该在长期存储中保存刷新令牌,并且只要它们保持有效就继续使用它们。如果您的应用程序请求太多刷新令牌,它可能会遇到这些限制,在这种情况下,旧的刷新令牌将停止工作。