Authorization 无法获得使用Python客户端库API处理GCS脚本的服务帐户授权
在尝试编写python脚本以使用基于服务的授权访问GCS时,我想到了以下几点。请注意,“key”是我的p12文件的内容 我正在尝试读取我帐户上的存储桶列表。我已经使用GCS的web界面成功地创建了一个bucket,并且可以通过gsutil看到这一点 当我执行下面的代码时,我得到一个403错误。起初我认为我没有得到正确的授权,但我尝试了这个非常有用的网页(它使用基于web的授权),它工作正常&_h=2& 当我查看标题和查询字符串并将它们与网站生成请求的keaders和query进行比较时,我发现没有授权标题,并且查询字符串中没有key=tag。我想我以为凭证授权会帮我解决这个问题 我做错了什么 代码:Authorization 无法获得使用Python客户端库API处理GCS脚本的服务帐户授权,authorization,google-cloud-storage,google-api-python-client,service-accounts,Authorization,Google Cloud Storage,Google Api Python Client,Service Accounts,在尝试编写python脚本以使用基于服务的授权访问GCS时,我想到了以下几点。请注意,“key”是我的p12文件的内容 我正在尝试读取我帐户上的存储桶列表。我已经使用GCS的web界面成功地创建了一个bucket,并且可以通过gsutil看到这一点 当我执行下面的代码时,我得到一个403错误。起初我认为我没有得到正确的授权,但我尝试了这个非常有用的网页(它使用基于web的授权),它工作正常&_h=2& 当我查看标题和查询字符串并将它们与网站生成请求的keaders和query进行比较时,我发现没
当我尝试执行时,我得到403 我成功了,但是,我使用的代码与您发布的代码片段没有本质上的区别。为了以防万一,你想把我的版本和你的版本区别开来,下面附上一个为我工作的Python程序的完整副本。我最初得到了403,就像您一样,这是由于继承了您的项目id:)。在更新该值以使用我的项目ID之后,我得到了一个正确的bucket列表。有两件事需要检查:
你在AppEngine上吗?如果没有,您是否尝试过像建议中那样使用boto?谢谢您修复我的格式!我采用这种方法是因为boto不支持服务帐户身份验证。这适用于在设备(安全摄像头)上本地运行的独立服务,而不是AppEngine用例。摄像机将其媒体上传到地面军事系统。嗨,马克,谢谢你的积极回应。我最初认为问题在于我没有启用GCS JSON API,但后来我从上面提到的网页上得到了一个OK和一个bucket列表。可能该页面使用了不同的身份验证方案。。。我昨天请求访问JSON API,但尚未获得授权。当我得到批准后,我会再试一次。如果你说的网页是指谷歌云存储web UI,它使用的是旧的XML API,而不是新的JSON API,因此不必通过JSON API验证你的访问。鉴于你昨天请求访问,我打赌那是你的问题。不管怎样,如果你不能很快获得访问权限,或者无法获得访问权限,请在此处发表评论。谢谢Marc-刚刚获得批准,并且按照预期工作。我被抛出是因为基于web的api explorer()返回JSON,所以我假设它使用的是JSON api。欢迎
credentials = SignedJwtAssertionCredentials(
'xxx-my-long-email-from-the-console@developer.gserviceaccount.com',
key,
scope='https://www.googleapis.com/auth/devstorage.full_control')
http = httplib2.Http()
http = credentials.authorize(http)
service = build("storage", "v1beta1", http=http)
# Build the request
request = service.buckets().list(projectId="159910083329")
# Diagnostic
pprint.pprint(request.headers)
pprint.pprint(request.to_json())
# Do it!
response = request.execute()
#!/usr/bin/env python
import pprint
import oauth2client
from oauth2client.client import SignedJwtAssertionCredentials
import httplib2
from apiclient.discovery import build
f = open('key.p12', 'r')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(
'REDACTED',
key,
scope='https://www.googleapis.com/auth/devstorage.full_control')
http = httplib2.Http()
http = credentials.authorize(http)
service = build("storage", "v1beta1", http=http)
# Build the request
request = service.buckets().list(projectId="REDACTED")
# Diagnostic
pprint.pprint(request.headers)
pprint.pprint(request.to_json())
# Do it!
response = request.execute()
pprint.pprint(response)