読者です 読者をやめる 読者になる 読者になる

直接 OpenStack の一時 URL を生成する [Ruby]

OpenStack では一時 URL を生成することができて、許可された利用者にダウンロードリンクを送信するときなどに使える。
設定された時間を超えるとリンクは無効になる。
普通は swift などのクライアントライブラリを利用するが、直接生成することもできる。

まずは一時 URL 生成鍵の確認をする。
コマンドラインから

$ curl -i -X HEAD https://openstack.url/v1/your_account -H "X-Auth-Token: auth_token"

で X-Account-Meta-Temp-Url-Key: に設定された値が存在すればそれを使う。
無ければ

$ curl -i -X POST https://openstack.url/v1/your_account -H "X-Auth-Token: auth_token" -H "X-Account-Meta-Temp-Url-Key: some_secret_string"

で鍵を設定できる。
鍵は任意で決められるが、

$ uuidgen -r

など安全な乱数を使用した方が良い。
一時 URL を生成するにはこの鍵と許可する http メソッド、リンクの有効時間、オブジェクトのパスが必要になる。
これらを組み合わせて計算した hmac 値が一時 URL になる。
鍵があれば OpenStack サーバーと通信せずにリンクを作ることができる。

require 'openssl'
# 上で設定した値
key = some_secret_string
# GET を許可
method = 'GET'
# 生成から一分間有効、形式は unix 時間
time = Time.now.to_i + 60
# container 中の object_name へのアクセスを許可
path = '/v1/your_account/container/object_name'
# これらをまとめて hmac 値を計算
body = "#{method}\n#{time}\n#{path}"
signature = OpenSSL::HMAC.hexdigest('sha1', key, body)
puts "https://openstack.url/v1/your_account/container/object_name?temp_url_sig=#{signature}&temp_url_expires=#{time}"

これで得られた URL に時間内にアクセスするとオブジェクトをダウンロードできる。

参考:
5.4 一時的に利用者にアクセスを許可するには? | CHANGE-MAKERS
Middleware — swift 2.7.1.dev64 documentation

OpenStack Swift ―Swiftオブジェクトストレージの管理と開発

OpenStack Swift ―Swiftオブジェクトストレージの管理と開発