LoginSignup
3
0

【PHP】BlobSharedAccessSignatureHelper::generateBlobServiceSharedAccessSignatureToken()の解説

Posted at

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人くらいでは?

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0