来自oauth2client的“AccessTokenRefreshError:无效响应403”

时间:2013-01-09 20:58:36

标签: google-drive-api google-api-python-client service-accounts

我正在创建一个脚本,该脚本将使用模拟该用户的服务帐户下载特定Google Apps用户的所有文件(使用提供的Python模板代码here(参见下面的代码块)。

def createDriveService(user_email):
  """Build and returns a Drive service object authorized with the service accounts
  that act on behalf of the given user.

  Args:
    user_email: The email of the user.
  Returns:
    Drive service object.
  """
f = file(SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'rb')
key = f.read()
f.close()

credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key,
  scope='https://www.googleapis.com/auth/drive', prn=user_email)
http = httplib2.Http()
http = credentials.authorize(http)

return build('drive', 'v2', http=http)

我已经能够使用此功能成功进行身份验证,并可以执行下载,文件列表请求等。但是,如果我尝试在短时间内执行超过四次下载,则会出现以下错误:< / p>

Traceback (most recent call last):
   // snip //
  File "C:\***\changeScan2.py", line 48, in createDriveService
    return build('drive', 'v2', http=http)
  File "build\bdist.win32\egg\oauth2client\util.py", line 120, in positional_wrapper
  File "build\bdist.win32\egg\apiclient\discovery.py", line 193, in build
  File "build\bdist.win32\egg\oauth2client\util.py", line 120, in positional_wrapper
  File "build\bdist.win32\egg\oauth2client\client.py", line 405, in new_request
  File "build\bdist.win32\egg\oauth2client\client.py", line 573, in _refresh
  File "build\bdist.win32\egg\oauth2client\client.py", line 629, in _do_refresh_request
oauth2client.client.AccessTokenRefreshError: Invalid response 403

程序成功获取要下载的文件列表(files.list),下载四个文件(每次验证),然后在第五次下载时提供上述错误。整个过程需要5-10秒。在使用不同文件的多次运行中,程序在下载第五个文件的过程中返回错误。

我将应用程序修剪为最基本的部分,尝试下载不同的文件,并收到相同的错误。我尝试捕获异常并为我的createDriveService函数实现指数退避,但错误似乎是在Google API客户端文件中,所以我无法缓解它。 Here's一个链接,用于查看oauth2client \ client.py的代码,该代码似乎给了我这些问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在获得SignedJwtAssertionCredentials私钥的API控制台中,该页面底部还有一个API密钥。将该API密钥作为developerKey参数传递给discovery.build()函数:

http://google-api-python-client.googlecode.com/hg/docs/epy/apiclient.discovery-module.html#build

当您达到配额限制(每日总限额或短期限额)时,将返回403响应。由于Drive每天提供500,000个请求的每日礼节配额限制,我认为您没有达到该限制,但您可能需要添加该API密钥以便实际获得完整配额。

我最近提交了对客户端库的更改,以便更好地处理403错误,这还不在发布的版本中,但如果你从头开始,你实际上会看到403作为一个异常应该是有关呼叫失败原因的完整信息。