为整个桶预签名 url

Pre-signed url for the whole bucket

我正在使用 gsutil 创建用于上传的预签名 URL。命名桶中的对象时,我可以成功上传。来自 gsutil 的以下片段适用于 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/

这 returns 来自 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>

我的卷曲线如下(为简洁起见,将签名 URL 替换为):

curl -X PUT --upload-file myobj.txt "<mysignedurl>"

甚至可以为上传和下载 to/from 整个 存储桶而不是为其中的每个对象创建签名的 URLs 吗?

这是不可能的,因为pre-signed URL只对一个对象有效。

不,这不可能。

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

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

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

一个解决方案是创建一个网络服务来响应授权请求(无论这在您的环境中可能意味着什么,例如基于用户的网络 cookie),其中 pre-signed URL请求中提供的参数,一旦 Web 服务验证了它们。请记住,如果这是一个需要写入存储桶的网站或应用程序,您永远不能相信这些东西只会发出 reasonable/safe 请求,因为它们不在您的控制范围内——因此参数验证会避免恶意行为至关重要。

另一个选项可能是 awscurl,它是一个 curl-like 工具,它自己进行请求签名。 GCS 有一个 AWS-compatibility 模式,所以这可能意味着你可以使用这个工具,as-is,或者它可以被改编或者 GCS 有一个类似的工具。但我假设您在其他地方需要签名的 URL,而不是本地计算机,否则您将只使用 gsutil 进行上传。