ロバメモ - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

Firebase Storage 新規作成とルールの書き方(簡易的な説明)

最初に記事を書いたときは、StorageでAssetBundleを利用したいと考えていたけど、 記事を書いた後に作業を進めていくと、DownloadHandlerAssetBundle.GetContent()でnullが返されるという不具合に遭遇。
しかも実機のときだけ。(こういうの一番困るー!)
Unityでは読み込めているのでFirebaseのルール設定の問題ではなくUnity側の(私が書いたスクリプトの)問題だと思われるが、修正方法も回避方法も見つからず断念。
で、AddressableというpackageがAssetBundle周りの処理をやってくれて便利らしいということを知って、現在それを利用してみようと模索中。

ということで、この記事の主旨を変更しました。(2020/12/30)

セキュリティ保護ルールの設定

Storageを新規で作成すると、ルールどうする?って聞かれる。
後からでも変更できるので、とりあえず次へ進む。

f:id:nico-taniku:20201225165042p:plain:w500

ロケーションの設定

これはプロジェクト全体の設定になるし、後から変更できないので、慎重に選択すべし。
すでに他のサービスで設定してる場合は聞かれないかも。
f:id:nico-taniku:20201225165132p:plain:w500
ロケーションには2種類あって、マルチリージョンとリージョンがあるらしい。
よくわからんが、データをどこで保管する?って感じなんだと勝手に理解。
やはり近い方が読み込みが早いらしいのと、課金にも関係してくるみたい。
日本では、2020年現在下記の2箇所があるみたい。

  • asia-northest1 : 東京
  • asia-northest2 : 大阪

Storageにフォルダを作成してみる

Storageのページの左上にFilesという項目があるので、そこをクリックする。
f:id:nico-taniku:20201225170338p:plain:w200

リストの右端にフォルダマークがあるのでそれをクリックすると作成できる。
f:id:nico-taniku:20201225170443p:plain:w300

publicというフォルダを作ってみた。
f:id:nico-taniku:20201225170736p:plain

とりあえず、適当なファイルをアップロードしてみる

下図の青いボタンでアップロードできる。 フォルダの中に入れたい場合は、フォルダを開いてからアップロード作業をすること。
f:id:nico-taniku:20201225170443p:plain:w300

public > 炎.mp3をアップロードした場合
f:id:nico-taniku:20201225171408p:plain
あの・・・鬼滅じゃないです。ただの効果音です。笑

ルールを設定する

ルールは左上のRulesタブから設定できる。
f:id:nico-taniku:20201225175200p:plain:w200

デフォルトルール

デフォルトのルールがこれになる。
認証済みの人しか読み書きできないよってルールになってる。

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {

    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }

  }
}

読み込みのみに限定したい

writeを外す

allow read: if request.auth != null;

書き込みのみに限定したい

readを外す

allow write: if request.auth != null;

誰でもアクセスできるようにしたい

if request.auth != null;を消す

allow read, write;

読みと書きで設定を変えたい

readとwriteを続けて書けばOK。
下の例は、読み:誰でも 書き:認証済み

allow read;
allow write: if request.auth != null;

特定のフォルダに対してルール設定したい

下記のように、2回目のmatchの後ろに/フォルダ名を挿入する。
matchと/の間は半角スペースを入れること。

match /public/{allPaths=**} {
}

注意点

指定したフォルダは親に設定されているルールの影響を受けるので、そちらが優先されて予期しない結果になることがある。
例えば、publicフォルダは書き込み不可に設定していても、ルート(というのかな?)のほうで認証済みなら書き込み可能の設定をしていると、ユーザーはpublicに書き込みできてしまう。

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /public/{allPaths=**} {
      allow read;
    }
    
    match /{allPaths=**} {
      allow read,write: if request.auth != null;
    }
  }
}

ルールをシミュレーションしてみる

ルールのところにある下図のボタンをクリックするとシミュレーションの条件を入力できるようになる。
f:id:nico-taniku:20201225175628p:plain:w200

シミュレーションタイプ

get : readで設定したルールが適応される
create(データ作成) , update(データ更新) , delete(データ削除): writeで設定したルールが適応される

場所

取得したいデータのパスを入力する

認証済みチェック

チェックを入れると認証済みのユーザーがアクセスした場合のシミュレーションをしてくれる。
特定のユーザーに限定したいなどがあれば、チェックを入れた時に展開される項目に追加で設定していく。

実行する

以下の条件をシミュレーションする場合

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /public/{allPaths=**} {
      allow read;
      allow write: if request.auth != null;
    }    
  }
}
認証しないでpublicをget

f:id:nico-taniku:20201230092020p:plain

認証しないでpublicにcreate

f:id:nico-taniku:20201230092117p:plain

認証済みでpublicにcreate

f:id:nico-taniku:20201230092204p:plain

以上