按照此处的说明操作: 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">
我已验证我的帐户已启用数据存储。我做错了什么?
答案 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"
]
一旦明确提到数据存储的范围,事情就会按预期工作。