AppAssertionCredentials失败,带401

时间:2015-02-16 20:19:59

标签: python google-api google-authentication google-api-python-client

按照此处的说明操作: https://developers.google.com/accounts/docs/OAuth2ServiceAccount?hl=en_US

我尝试在我的谷歌计算引擎实例上运行这个python脚本:

import httplib2
from googleapiclient.discovery import build
from oauth2client.gce import AppAssertionCredentials

credentials = AppAssertionCredentials("https://www.googleapis.com/auth/datastore")
http = credentials.authorize(httplib2.Http())
service = build('datastore', 'v1beta2', http=http)
x = service.datasets().lookup(body='', datasetId='surferjeff-easybates').execute(http=http)

但我仍然会收到此错误:

Traceback (most recent call last):
  File "C:/Users/surferjeff-easybates/Desktop/test.py", line 8, in <module>
    x = service.datasets().lookup(body='', datasetId='surferjeff-easybates').execute(http=http)
  File "C:\Python27\lib\site-packages\oauth2client\util.py", line 135, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "C:\Python27\lib\site-packages\googleapiclient\http.py", line 723, in execute
    raise HttpError(resp, content, uri=self.uri)
HttpError: <HttpError 401 when requesting https://www.googleapis.com/datastore/v1beta2/datasets/surferjeff-easybates/lookup?alt=json returned "Invalid Credentials">

我已验证我的帐户已启用数据存储。我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题与Google简单错误有关。

使用云控制台创建新实例并检查&#34;允许API访问同一项目中的所有Google Cloud服务&#34; 时,您将所有实例都包括在内可能的云范围。

当您尝试查看哪个REST请求生成了这个强大的功能时(通过按&#34;等效REST或命令行&#34; 按钮),您会看到实例是使用一个全局生成的范围如下:

  "scopes": [
    "https://www.googleapis.com/auth/cloud-platform"
  ]

如果您尝试使用具有相同作用域的Google API客户端(apiclient)创建此实例,则会发现它无法获取有效凭据以使用数据存储区服务。

解决方案在于,当您通过控制台创建实例时,单个范围显然不是Google为您的实例分配的范围。

如果在创建后打开实例详细信息,则会发现它具有以下范围:

  "scopes": [
    "https://www.googleapis.com/auth/cloud-platform",
    "https://www.googleapis.com/auth/datastore",
    "https://www.googleapis.com/auth/userinfo.email"
  ]

一旦明确提到数据存储的范围,事情就会按预期工作。