Firebase Storage には Firestore や Realtime Database のようにルールの設定があり、JSON でパスやファイルごとに読み書きの権限設定を変更できます。 Firebase Storage は複数のバケットを作ることができます。おそらくは保管するファイルの用途ごとに使用するバケットを変える(公開用と非公開用とか)ような使い方を想定しているように思いますが、Firebase Storage のルールはこのバケットごとに設定可能な点が他のプロダクトと異なります。
Firebase にはfirebase-tools
というCLIコマンドがあり、このコマンドのdeploy
オプションを使うとCLIからルールを変更できます。ルールはテキストファイルに書き出したものをデプロイするので、ルールを Git の管理下に置いてバージョン管理できるようになります。
ここで何も考えずにルールのJSONをファイルに書き出して、次のようにfirebase.json
を設定すると、デフォルトのバケットのみにルールが適用されます。
# storage.rules.json service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
# firebase.json { "storage": { "rules": "storage.rules.json" } }
複数バケットがある場合はバケットごとのルールを書き出した個別のファイルを用意し、デプロイ時にはそれらを対応するバケットに適用されるよう設定するには、firebase-tools
のデプロイターゲットを使います。
$ firebase target:apply storage <name> <resource_name>
たとえば、バケットの URI がそれぞれ、デフォルト=gs://myproject.appspot.com
, 追加したもの=gs://myproject-a89ee.appspot.com
だとすると
$ firebase target:apply storage main myproject.appspot.com $ firebase target:apply storage sub myproject-a89ee.appspot.com
とします。<name>
は好きなものを選びます。
これらのコマンドで、.firebaserc
に次のような差分が生成されます。
... + }, + "targets": { + "myproject": { + "storage": { + "main": [ + "myproject.appspot.com" + ], + "sub": [ + "myproject-a89ee" + ] + } + } ...
これをもとに、firebase.json
を次のように書き換えます。
# firebase.json { "storage": [ { "target": "main" "rules": "storage.rules.json" }, { "target": "sub" "rules": "storage_sub.rules.json" } ] }
これで、storage.rules.json
はデフォルトのバケット用に、storage_sub.rules.json
は追加したバケット用にそれぞれルールを定義できるようになります。