整个存储桶的预签名 url

Chr*_*ris 3 amazon-s3 amazon-web-services gsutil pre-signed-url google-cloud-platform

我正在使用 gsutil 创建用于上传的预签名 URL。当命名桶中的对象时,我可以成功上传。gsutil 中的以下 snipit 可以与curl PUT 配合使用:

gsutil signurl -m PUT -d 10m -r eu ~/.ssh/mycreds.json gs://cjreyn-bucket-0/myobjectname.txt
Run Code Online (Sandbox Code Playgroud)

但是,当仅指定存储桶名称而不是其中的对象时,上传任意对象不起作用:

gsutil signurl -m PUT -d 10m -r eu ~/.ssh/mycreds.json gs://cjreyn-bucket-0/
Run Code Online (Sandbox Code Playgroud)

这会从curl 返回以下内容:

<?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>
Run Code Online (Sandbox Code Playgroud)

我的curl行如下(为简洁起见,将签名的URL替换为):

curl -X PUT --upload-file myobj.txt "<mysignedurl>"
Run Code Online (Sandbox Code Playgroud)

是否甚至可以创建签名 URL 以用于向/从整个存储桶上传和下载,而不是针对其中的每个对象?

Mic*_*bot 7

不,这是不可能的。

签名的 URL 只授权一个特定的请求,该请求在签名之前会转换为其规范形式PUT然后,服务组装相同的表示形式并计算签名应该是什么,此时对于给定的动词(例如)、资源(桶+密钥)、一组凭证,有效签名只有一个正确答案、时间戳和过期时间。

签名实际上并不包括被授权的请求参数的副本——它们是在发出请求时从请求中推断出来的——因此没有机制可以将任何信息传递到可用于指定的服务,例如应允许使用通配符路径。

对存储桶本身的 URL进行签名PUT会授权该 URL 的持有者发送请求以创建具有该名称的存储桶,正如您收到的错误所暗示的那样。

一种解决方案是创建一个 Web 服务,一旦 Web 服务验证,该服务就会使用请求中提供的参数的预签名 URL 来响应授权请求(无论这在您的环境中意味着什么,例如基于用户的 Web Cookie)。他们。请记住,如果这是一个需要写入存储桶的网站或应用程序,您永远不能相信这些东西只会发出合理/安全的请求,因为它们超出了您的控制范围 - 因此参数验证至关重要以避免恶意行为。

另一种选择可能是awscurl使用类似curl 的工具来进行自己的请求签名。GCS 具有 AWS 兼容模式,因此这可能意味着您可以按原样使用此工具,或者可能可以对其进行调整,或者可能有一个适用于 GCS 的类似工具。但我假设您需要其他地方的签名 URL,而不是本地计算机,否则您将仅使用 gsutil 进行上传。