Amazon web services 通过签名URI列出S3存储桶中的对象版本

Amazon web services 通过签名URI列出S3存储桶中的对象版本,amazon-web-services,amazon-s3,uri,versioning,signed,Amazon Web Services,Amazon S3,Uri,Versioning,Signed,在我们的项目中,我们将对象存储在启用版本控制的S3存储桶中。除了为客户端创建要使用的签名URI之外,服务器上没有任何逻辑。我们希望保持这种方式,因为我们希望客户端完成所有处理 解决这个问题。我们能够成功地为整个对象的GET和PUT对象生成签名URI,但无法生成列出所有可用版本的URI 这是我们其中一个bucket中对象的GET url示例,它可以工作(99/2是bucket中的文件夹): 根据文档()我们应该附加?版本和不同的版本。我们尝试了以下方法: 这会导致浏览器抱怨签名错误,缺少“版本

在我们的项目中,我们将对象存储在启用版本控制的S3存储桶中。除了为客户端创建要使用的签名URI之外,服务器上没有任何逻辑。我们希望保持这种方式,因为我们希望客户端完成所有处理

解决这个问题。我们能够成功地为整个对象的GET和PUT对象生成签名URI,但无法生成列出所有可用版本的URI

这是我们其中一个bucket中对象的GET url示例,它可以工作(99/2是bucket中的文件夹):

根据文档()我们应该附加?版本和不同的版本。我们尝试了以下方法:

这会导致浏览器抱怨签名错误,缺少“版本”。如果我读了,我会解释为它不应该包含在签名中,除非我们也向它附加了一个值,而我们没有。问题是,如果我随后将其添加到签名创建中,这并不重要,因为它仍然会失败,并出现错误“没有密钥的?版本子资源”

是否有人为对象成功创建了签名uri以列出其版本?我们真的很想知道我们做错了什么!
我还想指出,我们没有使用内置的URI生成器,因为我们无法使它满足我们的需要。

列出对象版本是“针对”bucket而不是对象执行的操作。。。因此,无论您想列出哪些键,您的路径始终是
/

您可以将查询字符串中的键前缀指定为
前缀=…

然后,要签名的字符串将以
/bucketname/?versions&prefix=…
开头

您可以按词汇对所有查询字符串参数进行排序,但子资源(在本例中为
versions
)除外,它是第一个。如果有多个子资源,您也可以在它们之间按词汇顺序对它们进行排序,但它们仍然是第一位的。在要签名的字符串中,所有内容都用
&
分隔

重要提示:列表api可能不适合移交给客户端,因为您可能最终返回错误的内容。。。“前缀”就是一个前缀。如果它不完全匹配,它可以在子字符串上匹配,这可能不是您想要的。您可能还需要使用
分隔符
最大键
,并准备好通过截断的列表进行分页,这在返回大量结果时是必要的