临时 URL 中间件¶
要确定您的对象存储系统是否支持此功能,请咨询您的服务提供商或使用 /info 路径发送一个 GET 请求。
临时 URL 授予用户对对象的临时访问权限。例如,网站可能希望提供一个链接来下载对象存储中的大型对象,但对象存储帐户没有公共访问权限。网站可以生成一个 URL,该 URL 提供对对象的限时 GET 访问权限。当 Web 浏览器用户单击链接时,浏览器将直接从对象存储下载对象,无需网站充当请求的代理。
此外,临时 URL 可以基于前缀。这些 URL 包含一个签名,该签名对所有共享通用前缀的对象都有效。它们对于共享一组对象很有用。
请让您的云管理员启用临时 URL 功能。有关信息,请参阅源文档中的 TempURL。
注意
要使用 POST 请求将对象上传到特定的对象存储位置,请使用 Form POST 中间件,而不是临时 URL 中间件。
临时 URL 格式¶
临时 URL 由对象的 URL 加上附加的查询参数组成
示例临时 URL 格式
https://swift-cluster.example.com/v1/my_account/container/object
?temp_url_sig=732fcac368abb10c78a4cbe95c3fab7f311584532bf779abd5074e13cbe8b88b
&temp_url_expires=1323479485
&filename=My+Test+File.pdf
该示例显示以下元素
对象 URL:必需。指向对象的完整路径 URL。
temp_url_sig:必需。一个 HMAC 加密签名,定义了允许的 HTTP 方法、过期日期、指向对象的完整路径以及临时 URL 的密钥。集群必须支持使用的摘要(例如 SHA-256 或 SHA-512);支持的摘要将在集群的功能中的 tempurl.allowed_digests 键中列出。
temp_url_expires:必需。一个 UNIX Epoch 时间戳或 ISO 8601 UTC 时间戳的过期日期。例如,1390852007 或 2014-01-27T19:46:47Z 可用于表示 Mon, 27 Jan 2014 19:46:47 GMT。
有关更多信息,请参阅 Epoch & Unix 时间戳转换工具。
filename:可选。覆盖默认文件名。对象存储为 GET 临时 URL 生成一个基于对象名称的默认文件名。对象存储在 Content-Disposition 响应头中返回此值。浏览器可以将此文件名值解释为要保存的文件附件。
基于前缀的临时 URL 类似,但需要 temp_url_prefix 参数,该参数必须等于所有对象名称共享的通用前缀,URL 对其有效。
https://swift-cluster.example.com/v1/my_account/container/my_prefix/object
?temp_url_sig=732fcac368abb10c78a4cbe95c3fab7f311584532bf779abd5074e13cbe8b88b
&temp_url_expires=2011-12-10T01:11:25Z
&temp_url_prefix=my_prefix
密钥¶
临时 URL 和 Form POST 中间件 中使用的加密签名使用密钥。对象存储允许您为每个帐户和每个容器存储两个密钥值。在验证请求时,对象存储会针对所有密钥检查签名。在每个级别使用两个密钥可实现密钥轮换,而不会使现有的临时 URL 无效。
要设置帐户级别的密钥,请将以下请求标头之一或两者设置为任意值,通过 POST 请求发送到帐户
X-Account-Meta-Temp-URL-KeyX-Account-Meta-Temp-URL-Key-2
要设置容器级别的密钥,请将以下请求标头之一或两者设置为任意值,通过 POST 或 PUT 请求发送到容器
X-Container-Meta-Temp-URL-KeyX-Container-Meta-Temp-URL-Key-2
这些任意值充当密钥。
例如,使用 swift post 命令将密钥设置为 ``MYKEY``
$ swift post -m "Temp-URL-Key:MYKEY"
注意
更改这些标头会在 60 秒内使先前生成的所有临时 URL 无效,这是密钥的 memcache 时间。
临时 URL 的 HMAC 签名¶
临时 URL 中间件使用 HMAC 加密签名。此签名包括以下元素
允许的方法。通常,GET 或 PUT。
过期时间。在下面的临时 URL HMAC-SHA256 签名示例中,过期时间设置为未来
86400秒(或 1 天)。请注意,您必须使用 UNIX 时间戳来生成签名(在 API 请求中,也可以使用 ISO 8601 UTC 时间戳)。路径。从
/v1/开始,包括容器名称和对象。基于前缀的签名的路径必须以prefix:/v1/开头。在此阶段不要对路径进行 URL 编码。密钥。使用 密钥 中描述的其中一个密钥值。
以下 Python 代码示例演示了如何计算用于临时 URL 的签名
基于对象的临时 URL 的示例 HMAC-SHA256 签名
import hmac
from hashlib import sha256
from time import time
method = 'GET'
duration_in_seconds = 60*60*24
expires = int(time() + duration_in_seconds)
path = '/v1/my_account/container/object'
key = 'MYKEY'
hmac_body = '%s\n%s\n%s' % (method, expires, path)
signature = hmac.new(key, hmac_body, sha256).hexdigest()
基于前缀的临时 URL 的示例 HMAC-SHA512 签名
import hmac
from hashlib import sha512
from time import time
method = 'GET'
duration_in_seconds = 60*60*24
expires = int(time() + duration_in_seconds)
path = 'prefix:/v1/my_account/container/my_prefix'
key = 'MYKEY'
hmac_body = '%s\n%s\n%s' % (method, expires, path)
signature = hmac.new(key, hmac_body, sha512).hexdigest()
在生成 HMAC 签名时,不要对路径进行 URL 编码。但是,在发出实际 HTTP 请求时,应正确对 URL 进行 URL 编码。
``MYKEY`` 值是 密钥 中描述的其中一个密钥值。
有关更多信息,请参阅 RFC 2104: HMAC: 用于消息身份验证的密钥哈希。
如果您想将 UNIX 时间戳转换为 ISO 8601 UTC 时间戳,可以使用以下代码片段
import time
time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(timestamp))
使用 swift 工具生成临时 URL¶
swift 工具提供了 tempurl 选项,该选项可以自动生成 ``temp_url_sig`` 和 ``temp_url_expires`` 查询参数。例如,您可以运行以下命令
$ swift tempurl GET 3600 /v1/my_account/container/object MYKEY
注意
swift 工具尚未更新,并且继续使用已弃用的密码 SHA1。
此命令返回路径
/v1/my_account/container/object
?temp_url_sig=5c4cc8886f36a9d0919d708ade98bf0cc71c9e91
&temp_url_expires=1374497657
要创建临时 URL,请将对象存储存储主机名作为前缀添加到此路径。例如,将路径与 https://swift-cluster.example.com 作为前缀,如下所示
https://swift-cluster.example.com/v1/my_account/container/object
?temp_url_sig=5c4cc8886f36a9d0919d708ade98bf0cc71c9e91
&temp_url_expires=1374497657
请注意,如果完全复制上面的示例并在命令 shell 中使用,则将 ampersand 解释为运算符,并且 URL 将被截断。将 URL 括在引号中以避免这种情况。