2014-11-04 148 views
2

我使用这个endpoint谷歌云存储提供了 '权限不足'

get_media(bucket=*, object=*, ifGenerationNotMatch=None, generation=None, ifMetagenerationMatch=None, ifGenerationMatch=None, ifMetagenerationNotMatch=None, projection=None) 

它给我的错误:

apiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/storage/v1/b/my-logs/o/clickstream.1413365729497.log?alt=json returned "Insufficient Permission"> 

代码:

service = build('storage', 'v1') 
contents = service.objects().get(bucket=item['bucket'], object=item['name']).execute(http=http) 

item来自先前(成功)的buckets.list呼叫。这就是为什么服务帐户的权限错误非常奇怪。

这是目前在我的本地和我的身份验证:

with open(FILE_KEY, 'rb') as f: 
    key = f.read() 

credentials = SignedJwtAssertionCredentials(
    SERVICE_EMAIL_ADDRESS, 
    key, 
    scope='https://www.googleapis.com/auth/devstorage.full_control', 
) 

http = httplib2.Http() 
http = credentials.authorize(http) 

的对象(后来我上传了新的测试对象),都以默认的ACL权限创建。为什么这对服务帐户无法检索文件内容?

+0

对不起,我很困惑。我看到了对service.objects.get()的调用,但我也看到了对service.objects()。get_media()的调用。哪个失败? – 2014-11-04 18:58:09

回答

1

有两件事情可以在这里干扰:

  1. 清单在桶中的对象要求在水桶读取权限,而得到一个对象,甚至只是它的元数据,需要在物体上读取权限。这可能是您的服务帐户有第一个权限,而不是第二个权限。
  2. 默认情况下,服务帐户不属于项目所有者,编辑者或查看者组,因此它们不会显示在存储桶默认ACL或对象默认ACL中。

您的存储桶ACL上是否明确有服务帐户?对象?服务帐户是否列在存储区的默认对象ACL中,因此写入的新对象不会覆盖该ACL,从而允许服务帐户读取它?

另请参阅Access Control

+1

我将服务帐户的电子邮件添加到对象本身,但我仍收到403.任何想法? – Tjorriemorrie 2014-11-05 16:03:33

+1

@Tjorriemorrie你能弄明白吗?我想我遇到了同样的情况,我可以将对象上传到存储桶,但无法使用服务帐户更改ACL – 2015-04-25 23:19:38