BlobSharedAccessSignatureHelper::generateBlobServiceSharedAccessSignatureToken()の使い方がわからなくて死にそうだったので調査した結果です。
そもそも何これ?
Azure Storage BLOBにアクセスするためのSASを発行する関数です。
有効期限などを好きに決められるので、1時間だけ見せたいみたいなことが簡単にできます。
BlobSharedAccessSignatureHelper::generateBlobServiceSharedAccessSignatureToken()
public function generateBlobServiceSharedAccessSignatureToken(
string $signedResource,
string $resourceName,
string $signedPermissions,
\Datetime|string $signedExpiry,
\Datetime|string $signedStart = "",
string $signedIP = "",
string $signedProtocol = "",
string $signedIdentifier = "",
string $cacheControl = "",
string $contentDisposition = "",
string $contentEncoding = "",
string $contentLanguage = "",
string $contentType = ""
)
{}
$signedResource
Resources::RESOURCE_TYPE_CONTAINER
もしくはResources::RESOURCE_TYPE_BLOB
のいずれか。
Resources::RESOURCE_TYPE_CONTAINER
だとコンテナ単位の許可を与える。
Resources::RESOURCE_TYPE_BLOB
だとBLOB単位の許可を与える。
$resourceName
RESOURCE_TYPE_CONTAINER
の場合はコンテナ名。
foo
とかbar
とか。
RESOURCE_TYPE_BLOB
の場合はフルパス。
foo/path/to/image.png
みたいになる。
$signedPermissions
RESOURCE_TYPE_CONTAINER
の場合はracwdl
のいずれか1文字。
RESOURCE_TYPE_BLOB
の場合はracwd
のいずれか1文字。
rは読み取りのみ。
a・c・wはadd・create・writeで書き込み権限。
それぞれできることが違うみたいだけどよくわからない。
dは削除できる。
lはBLOBの一覧を取得する場合。
$signedExpiry
SASの有効期限。UTC。
文字列の場合は'Y-m-d\TH:i:s\Z'とかいうよくわからない形式でないと動かないので、DateTimeで渡した方が安全。
DateTimeImmutableは渡せない。
ここまで必須。
$signedStart
SASが有効になる時刻。UTC。
明日から有効にしたいとかの場合に指定する。
$signedIP
リクエスト元のIPアドレスを限定したいときに指定する。
$signedProtocol
値は'https'か'https,http'のどちらかだけ。
デフォルトは'https,http'と書いてあるのだが、未指定でhttpアクセスしてみたらThe account being accessed does not support http
って言われたのでよくわからない。
$signedIdentifier
64文字以内の文字列。
BLOBに対してさらに別のアクセス制限を追加することができ、そのアクセスポリシーIDが一致しないとアクセスできない。
ということらしいのだが、使ったことがないのでよくわからない。
どうもコンテナ単位でしか設定できないっぽい?
$cacheControl
BLOBにリクエストした際に返されるレスポンスにおいて、HTTPヘッダフィールドCache-Controlを変更したい場合に指定する。
$contentDisposition
BLOBにリクエストした際に返されるレスポンスにおいて、HTTPヘッダフィールドContent-Dispositionを変更したい場合に指定する。
$contentEncoding
BLOBにリクエストした際に返されるレスポンスにおいて、HTTPヘッダフィールドContent-Encodingを変更したい場合に指定する。
$contentLanguage
BLOBにリクエストした際に返されるレスポンスにおいて、HTTPヘッダフィールドContent-Languageを変更したい場合に指定する。
$contentType
BLOBにリクエストした際に返されるレスポンスにおいて、HTTPヘッダフィールドContent-Typeを変更したい場合に指定する。
使い方
$sas = (new BlobSharedAccessSignatureHelper())->generateBlobServiceSharedAccessSignatureToken(
Resources::RESOURCE_TYPE_CONTAINER,
'samplecontainer',
'r',
new \DateTime('+1 hour'),
);
$url = 'https://example.blob.core.windows.net/samplecontainer/foo/bar/image.png?' . $sas;
echo "<img src='{$url}'>";
感想
とてもつらい。
とはいえ昔はBlobSharedAccessSignatureHelper::generateBlobServiceSharedAccessSignatureToken()
自体が存在しておらず、自力でSASを実装しようとして死んだことがあるので、そのころに比べたらだいぶマシです。
ちなみに死んだ理由ですが公式ドキュメントが嘘っぱちであり、seが2023-01-01T00:00:00Z
とかいう形でないと駄目なんですよね。
そんなもんわかるか。
なお、Microsoft Azure Storage PHP Client Librariesは既に死んだので、今後はAzure-OSS Storage PHP Client Librariesなどを使うとよいでしょう。
まあAzureかつPHPのコミュニティなんてどのくらい続くか怪しいものですが。
そもそもこれが必要な人って世界に10人くらいでは?