This work is licensed under a Creative Commons Attribution 3.0
Unported License.
http://creativecommons.org/licenses/by/3.0/legalcode
临时 URL 中间件应该允许使用基于前缀的签名,这授予对所有具有此特定前缀的对象访问权限。 这允许使用一个签名访问整个容器或伪文件夹,而不是为每个对象使用新的签名。
目前,如果想与外部人员共享容器/伪文件夹内的大量对象,则必须为每个对象创建临时 URL。 此外,在生成签名后放置在容器/伪文件夹内的对象无法使用相同的签名访问。 基于前缀的签名将允许重用相同的签名来处理共享相同前缀的大量对象。
用例
临时 URL 中间件应该被更改。 代码更改不应太大。 如果客户端希望使用基于前缀的签名,他可以附加一个 URL 参数“temp_url_prefix”以及所需的 前缀(空前缀将指定整个容器),并且中间件将仅使用容器路径 + 前缀来计算签名。 此外,中间件将检查对象路径是否确实包含此前缀。
让我们举两个例子。 在第一个例子中,我们希望允许用户在容器 c 中上传一堆对象。 他首先创建一个 tempurl,例如使用 swift 命令行工具(修改后的版本,支持容器级别作用域的 tempurls)
$swift tempurl --container-level PUT 86400 /v1/AUTH_account/c/ KEY
/v1/AUTH_account/c/?temp_url_sig=9dd9e9c318a29c6212b01343a2d9f9a4c9deef2d&temp_url_expires=1439280760&temp_url_prefix=
然后用户使用每次相同的容器级别签名上传一堆文件
$curl -XPUT --data-binary @file1 https://example.host/v1/AUTH_account/c/o1?temp_url_sig=9dd9e9c318a29c6212b01343a2d9f9a4c9deef2d&temp_url_expires=1439280760&temp_url_prefix=
$curl -XPUT --data-binary @file2 https://example.host/v1/AUTH_account/c/o2?temp_url_sig=9dd9e9c318a29c6212b01343a2d9f9a4c9deef2d&temp_url_expires=1439280760&temp_url_prefix=
$curl -XPUT --data-binary @file3 https://example.host/v1/AUTH_account/c/p/o3?temp_url_sig=9dd9e9c318a29c6212b01343a2d9f9a4c9deef2d&temp_url_expires=1439280760&temp_url_prefix=
在下一个例子中,我们希望允许外部用户下载整个伪文件夹 p
$swift tempurl --container-level GET 86400 /v1/AUTH_account/c/p KEY
/v1/AUTH_account/c/p?temp_url_sig=4e755839d19762e06c12d807eccf46ff3224cb3f&temp_url_expires=1439281346&temp_url_prefix=p
$curl https://example.host/v1/AUTH_account/c/p/o1?temp_url_sig=4e755839d19762e06c12d807eccf46ff3224cb3f&temp_url_expires=1439281346&temp_url_prefix=p
$curl https://example.host/v1/AUTH_account/c/p/o2?temp_url_sig=4e755839d19762e06c12d807eccf46ff3224cb3f&temp_url_expires=1439281346&temp_url_prefix=p
$curl https://example.host/v1/AUTH_account/c/p/p2/o3?temp_url_sig=4e755839d19762e06c12d807eccf46ff3224cb3f&temp_url_expires=1439281346&temp_url_prefix=p
由于缺少/错误的前缀,以下请求将被拒绝
$curl https://example.host/v1/AUTH_account/c/o4?temp_url_sig=4e755839d19762e06c12d807eccf46ff3224cb3f&temp_url_expires=1439281346&temp_url_prefix=p
$curl https://example.host/v1/AUTH_account/c/p3/o5?temp_url_sig=4e755839d19762e06c12d807eccf46ff3224cb3f&temp_url_expires=1439281346&temp_url_prefix=p
可以引入一个新的中间件。 但这似乎只会导致大量的代码复制,因为与原始中间件相比,更改非常小。
添加对 tempurl 和各自测试模块的修改。
无
无
无
修改 tempurl 中间件的文档。
签名的计算使用 hmac 模块 (https://docs.pythonlang.cn/2/library/hmac.html) 结合 sha1 哈希函数。 基于前缀的签名与当前基于对象路径的签名之间的区别在于,路径被缩小到前缀。 计算的其余部分保持不变。 较短的路径会产生较短的消息作为 hmac 计算的输入,这不应降低加密强度。 因此,我没有看到引入基于前缀的签名存在安全相关的问题。
应该将测试添加到现有的测试模块。
无