谷歌云存储提示“权限不足”
我正在使用这个接口:
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)
这些对象(还有我之后上传的新测试对象)都是用默认的访问控制权限创建的。为什么服务账户无法获取文件内容呢?
1 个回答
1
这里有两个可能会影响你操作的事情:
- 要列出一个存储桶里的对象,你需要对这个存储桶有读取权限;而获取一个对象,即使只是获取它的一些基本信息,也需要对这个对象有读取权限。可能你的服务账号有对存储桶的读取权限,但没有对对象的读取权限。
- 服务账号默认不属于项目的拥有者、编辑者或查看者组,所以它们不会出现在存储桶或对象的默认访问控制列表(ACL)中。
你的存储桶的访问控制列表里有没有明确列出这个服务账号?对象里有没有?这个服务账号是否在存储桶的默认对象访问控制列表中,这样新写入的对象如果没有其他设置,可以让这个服务账号读取它?
更多信息可以查看 访问控制。