我正在使用gsutil创建用于上传的预签名URL。在存储桶中命名对象时,我可以成功上传。以下来自gsutil的snipit可与curl PUT配合使用:
gsutil signurl -m PUT -d 10m -r eu ~/.ssh/mycreds.json gs://cjreyn-bucket-0/myobjectname.txt
但是,仅指定存储桶名称而不是其中的对象时,上传任意对象无效:
gsutil signurl -m PUT -d 10m -r eu ~/.ssh/mycreds.json gs://cjreyn-bucket-0/
这将返回以下卷曲:
<?xml version='1.0' encoding='UTF-8'?><Error><Code>BucketAlreadyOwnedByYou</Code><Message>Your previous request to create the named bucket succeeded and you already own it.</Message></Error>
我的卷曲行如下(为简洁起见,将签名URL替换为):
curl -X PUT --upload-file myobj.txt "<mysignedurl>"
是否甚至可以创建签名的URL,以便上传和下载到整个存储桶,而不是为其中的每个对象进行下载?
答案 0 :(得分:1)
否,这是不可能的。
已签名的URL恰好授权了一个特定的请求,该请求会在签名前转换为其canonical form。然后,该服务将组装相同的表示形式并计算签名应该是什么,此时,对于给定的动词(例如PUT
),资源(存储桶+键),对于有效签名的含义只有一个正确的答案。 ),凭据集,时间戳记和有效期。
签名实际上并不包括被授权的请求参数的副本-它们是在发出请求时从请求中推断出的-因此,没有机制可以将任何信息传递给服务以用于指定例如应该允许使用通配符路径。
为存储桶本身签名PUT
URL会授权该URL的持有者发送创建具有该名称的存储桶的请求,这是您收到的错误所隐含的。
一种解决方案是创建一个Web服务,该服务使用预先签名的URL来响应请求中提供的参数的授权请求(无论在环境中,例如,基于用户的Web cookie,这可能意味着什么)。 Web服务验证它们。请记住,如果这是需要写入存储桶的网站或应用程序,则您永远无法相信那些事情只能发出合理/安全的请求,因为它们不在您的控制范围之内-因此参数验证至关重要避免恶意行为。
另一个选项可能是awscurl
,它是一个卷曲的工具,可以自己进行请求签名。 GCS具有AWS兼容模式,因此这可能意味着您可以按原样使用此工具,或者可以对其进行改编,或者有一个类似的GCS工具。但是我认为您需要在其他地方而不是本地计算机上签名的URL,否则您将只使用gsutil进行上传。
答案 1 :(得分:0)
这是不可能的,因为预先签名的URL仅对一个对象有效。