注意
本文档适用于 Ceph 的开发版本。
临时URL操作
为了允许临时访问对象(例如用于 GET 请求)而无需共享凭证,radosgw 的 swift 端点支持临时 URL 功能。要使用此功能,首先需要设置 X-Account-Meta-Temp-URL-Key 的值以及可选的 X-Account-Meta-Temp-URL-Key-2。临时 URL 功能依赖于针对这些密钥的 HMAC-SHA1 签名。
注意
如果您计划为 Swift API 启用临时 URL 功能,强烈建议在端点定义中包含 Swift 账户名称,以最接近地模仿原生 OpenStack Swift 的行为。为此,请在 ceph.conf 中设置配置选项 rgw swift account in url = true,并将 Keystone 端点更新为 URL 后缀 /v1/AUTH_%(tenant_id)s(而不是仅仅 /v1)。
POST 临时URL密钥
对 Swift 账户执行包含所需密钥的 POST 请求将为该账户设置秘密临时 URL 密钥,从而可以为该账户提供临时 URL 访问。最多支持两个密钥,如果存在,签名将针对这两个密钥进行检查,以便在不使临时 URL 失效的情况下轮换密钥。
注意
原生 OpenStack Swift 也支持在容器级别设置临时 URL 密钥的选项,方法是对容器发出 POST 或 PUT 请求并设置 X-Container-Meta-Temp-URL-Key 或 X-Container-Meta-Temp-URL-Key-2。radosgw 不支持此功能;临时 URL 密钥只能在账户级别设置和使用。
语法
POST /{api version}/{account} HTTP/1.1
Host: {fqdn}
X-Auth-Token: {auth-token}
请求头
X-Account-Meta-Temp-URL-Key
- 描述:
用户定义的密钥,取任意字符串值。
- 类型:
String
- 必需:
是
X-Account-Meta-Temp-URL-Key-2
- 描述:
用户定义的密钥,取任意字符串值。
- 类型:
String
- 必需:
否
GET 临时URL对象
临时 URL 使用加密 HMAC-SHA1 签名,其中包含以下元素:
请求方法的值,例如“GET”
过期时间,格式为自纪元以来的秒数,即 Unix 时间
从“v1”开始的请求路径
上述各项之间用换行符分隔并进行规范化,然后使用 SHA-1 哈希算法针对先前发布的临时 URL 密钥之一生成 HMAC。
下面是一个演示上述过程的 Python 脚本示例:
import hmac
from hashlib import sha1
from time import time
method = 'GET'
host = 'https://objectstore.example.com/swift'
duration_in_seconds = 300 # Duration for which the url is valid
expires = int(time() + duration_in_seconds)
path = '/v1/your-bucket/your-object'
key = 'secret'
hmac_body = '%s\n%s\n%s' % (method, expires, path)
sig = hmac.new(key, hmac_body, sha1).hexdigest()
rest_uri = "{host}{path}?temp_url_sig={sig}&temp_url_expires={expires}".format(
host=host, path=path, sig=sig, expires=expires)
print(rest_uri)
# Example Output
# https://objectstore.example.com/swift/v1/your-bucket/your-object?temp_url_sig=ff4657876227fc6025f04fcf1e82818266d022c6&temp_url_expires=1423200992