Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Firebase CloudStorageセキュリティルールの使用条件

このガイドでは、上に構築Firebaseセキュリティルール言語のコア構文を学ぶクラウドストレージのためのあなたのFirebaseセキュリティルールに条件を追加する方法を示すために、ガイドを。

クラウドストレージセキュリティルールの主要なビルディング・ブロックが条件です。条件は、特定の操作を許可するか拒否するかを決定するブール式です。基本的なルールについては、使用してtruefalse条件としてリテラルはprefectlyうまく動作します。ただし、クラウドストレージ言語のFirebaseセキュリティルールを使用すると、次のようなより複雑な条件を記述できます。

  • ユーザー認証を確認する
  • 受信データを検証する

認証

CloudStorageのFirebaseセキュリティルールはFirebaseAuthenticationと統合され、CloudStorageに強力なユーザーベースの認証を提供します。これにより、Firebase認証トークンの申し立てに基づいたきめ細かいアクセス制御が可能になります。

ときに認証されたユーザが行うクラウドストレージに対する要求、 request.auth変数は、ユーザが取り込まれuidrequest.auth.uid )ならびにFirebase認証JWT(特許請求の範囲request.auth.token )。

カスタム認証を使用する場合にさらに、追加の請求をして浮上しているrequest.auth.tokenフィールド。

認証されていないユーザが要求を行う際、 request.auth変数であるnull

このデータを使用して、認証を使用してファイルを保護する一般的な方法がいくつかあります。

  • 公開:無視request.auth
  • プライベート認証済み:チェックすることをrequest.authないnull
  • ユーザープライベート:ことを確認request.auth.uidパスに等しいuid
  • グループプライベート:カスタムトークンのクレームをチェックして、選択したクレームと一致させるか、ファイルメタデータを読み取って、メタデータフィールドが存在するかどうかを確認します

公衆

考慮していない任意のルールrequest.auth文脈を考慮することができるpublicそれは、ユーザの認証コンテキストを考慮していないことから、ルール。これらのルールは、ゲームアセット、サウンドファイル、その他の静的コンテンツなどの公開データを表示するのに役立ちます。

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

認証されたプライベート

場合によっては、アプリケーションの認証されたすべてのユーザーがデータを表示できるようにしたいが、認証されていないユーザーはデータを表示したくない場合があります。以来request.auth変数があるnullすべての認証されていないユーザーのために、あなたがしなければならないすべてがチェックされrequest.auth変数は、認証を必要とするために存在します。

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

ユーザープライベート

圧倒的にするための最も一般的な使用例request.authアップロードプロフィール写真からプライベート文書を読むこと:自分のファイルに詳細なアクセス許可を持つ個々のユーザーに提供することになります。

クラウドストレージ内のファイルは、ファイルへの完全な「パス」を持っているので、それはユーザが制御ファイルを作成するのにかかるすべてが(例えば、ユーザのようファイル名の接頭辞でユニークな、ユーザ識別情報の一部であるuid確認することができます)ルールが評価されるとき:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

グループプライベート

もう1つの同様に一般的な使用例は、複数のチームメンバーが共有ドキュメントで共同作業できるようにするなど、オブジェクトに対するグループ権限を許可することです。これを行うには、いくつかのアプローチがあります。

  • ミントFirebase認証カスタムトークン(例えば、グループIDのような)グループメンバーに関する追加情報が含まれてい
  • (例えば、グループIDまたは許可のリストとしてグループ情報含むuidにおけるS)ファイルのメタデータを

このデータがトークンまたはファイルのメタデータに保存されると、ルール内から参照できます。

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

評価をリクエストする

アップロード、ダウンロード、メタデータの変更、および削除が使用して評価されているrequestクラウドストレージに送信されます。ユーザの一意IDとにFirebase認証ペイロードに加えてrequest.auth上述したように、オブジェクト、 request変数要求が、要求が受信される時間を行われているファイルパスが含まれており、新たなresource場合、値リクエストは書き込みです。 HTTPヘッダーと認証状態も含まれています。

requestオブジェクトは、ユーザーの一意のIDとでFirebase認証ペイロードが含まれrequest.authでさらに説明されるオブジェクト、ユーザーベースのセキュリティドキュメントのセクションを。

プロパティの完全なリストrequestオブジェクトは、以下の利用可能です。

財産タイプ説明
auth map <文字列、文字列>ユーザーがログインしている場合は、提供しuid 、ユーザーの一意のID、およびtoken 、Firebase認証JWT請求のマップを。そうでなければ、それはなりnull
params map <文字列、文字列>リクエストのクエリパラメータを含むマップ。
pathpath要求で行われているパスを表します。
resource map <文字列、文字列>のみに存在する新しいリソース値、 write要求。
timeタイムスタンプリクエストが評価されるサーバー時間を表すタイムスタンプ。

リソース評価

ルールを評価するときは、アップロード、ダウンロード、変更、または削除されるファイルのメタデータを評価することもできます。これにより、特定のコンテンツタイプのファイルのみをアップロードしたり、特定のサイズを超えるファイルのみを削除したりするなど、複雑で強力なルールを作成できます。

クラウドストレージのためのFirebaseセキュリティルールにファイルのメタデータを提供しresourceクラウドストレージオブジェクトに浮上したメタデータのキー/値のペアを含む、オブジェクト。これらのプロパティは、上で検査することができreadまたはwriteデータの整合性を確保するために要求します。

上のwrite (例えばアップロード、メタデータ更新、削除など)の要求に加えてresource現在の要求パスに存在するファイルのファイルメタデータを含むオブジェクト、あなたはまた、使用する機能持つrequest.resourceオブジェクトを、これには、書き込みが許可されている場合に書き込まれるファイルメタデータのサブセットが含まれています。これらの2つの値を使用して、データの整合性を確保したり、ファイルの種類やサイズなどのアプリケーションの制約を適用したりできます。

プロパティの完全なリストresourceオブジェクトは、以下の利用可能です。

財産タイプ説明
nameストリングオブジェクトのフルネーム
bucketストリングこのオブジェクトが存在するバケットの名前。
generation int Googleクラウドストレージオブジェクト生成このオブジェクトの。
metageneration int Googleクラウドストレージオブジェクトmetagenerationこのオブジェクトの。
size intオブジェクトのサイズ(バイト単位)。
timeCreatedタイムスタンプオブジェクトが作成された時刻を表すタイムスタンプ。
updatedタイムスタンプオブジェクトが最後に更新された時刻を表すタイムスタンプ。
md5HashストリングオブジェクトのMD5ハッシュ。
crc32cストリングオブジェクトのcrc32cハッシュ。
etagストリングこのオブジェクトに関連付けられているetag。
contentDispositionストリングこのオブジェクトに関連付けられているコンテンツの配置。
contentEncodingストリングこのオブジェクトに関連付けられているコンテンツエンコーディング。
contentLanguageストリングこのオブジェクトに関連付けられているコンテンツ言語。
contentTypeストリングこのオブジェクトに関連付けられているコンテンツタイプ。
metadata map <文字列、文字列>追加の開発者指定のカスタムメタデータのキー/値ペア。

request.resourceを除いて、これらのすべてが含まれているgenerationmetagenerationetagtimeCreated 、およびupdated

データを検証する

クラウドストレージのためのFirebaseセキュリティルールはまた、ファイル名とパスだけでなく、このようなファイルのメタデータプロパティの検証を含め、データ検証のために使用することができるcontentTypesize

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

カスタム関数

Firebaseセキュリティルールがより複雑になるにつれて、ルールセット全体で再利用できる関数で条件のセットをラップすることができます。セキュリティルールはカスタム機能をサポートします。カスタム関数の構文はJavaScriptに少し似ていますが、Firebase Security Rules関数は、いくつかの重要な制限があるドメイン固有言語で記述されています。

  • 機能は、単一含めることができreturn文を。追加のロジックを含めることはできません。たとえば、ループを実行したり、外部サービスを呼び出したりすることはできません。
  • 関数は、それらが定義されているスコープから関数と変数に自動的にアクセスできます。例えば、内に定義された関数service firebase.storage範囲はアクセス有するresource変数を、クラウドFirestoreのみ、組み込みなどの機能get()およびexists()
  • 関数は他の関数を呼び出すことができますが、再帰することはできません。コールスタックの合計深度は10に制限されています。
  • バージョンではrules2 、機能は使用して変数を定義することができますletキーワードを。関数は任意の数のletバインディングを持つことができますが、returnステートメントで終了する必要があります。

この関数はで定義されたfunctionキーワードと0個以上の引数を取ります。たとえば、上記の例で使用されている2つのタイプの条件を1つの関数に結合したい場合があります。

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

Firebaseセキュリティルールで関数を使用すると、ルールの複雑さが増すにつれて、関数のメンテナンスが容易になります。

次のステップ

この条件の説明の後、ルールをより高度に理解し、次の準備が整います。

コアユースケースを処理する方法を学び、ルールを開発、テスト、および展開するためのワークフローを学びます。