このガイドは、Firebaseセキュリティルール言語ガイドのコア構文を学習して、クラウドストレージのFirebaseセキュリティルールに条件を追加する方法を示しています。
クラウドストレージセキュリティルールの主要な構成要素は条件です。条件は、特定の操作を許可するか拒否するかを決定するブール式です。基本的なルールの場合、条件としてtrue
およびfalse
リテラルを使用すると、問題なく機能します。ただし、クラウドストレージ言語のFirebaseセキュリティルールでは、次のようなより複雑な条件を記述できます。
- ユーザー認証を確認する
- 受信データを検証する
認証
CloudStorageのFirebaseセキュリティルールはFirebaseAuthenticationと統合され、CloudStorageに強力なユーザーベースの認証を提供します。これにより、Firebase認証トークンの申し立てに基づいたきめ細かいアクセス制御が可能になります。
認証されたユーザーがCloudStorageに対してリクエストを実行すると、 request.auth
変数にユーザーのuid
( request.auth.uid
)とFirebase Authentication 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
の最も一般的な使用例は、プロフィール写真のアップロードからプライベートドキュメントの読み取りまで、個々のユーザーにファイルに対するきめ細かい権限を与えることです。
Cloud Storage内のファイルにはファイルへの完全な「パス」があるため、ユーザーがファイルを制御するために必要なのは、ファイル名プレフィックス内の一意のユーザー識別情報(ユーザーの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つの同様に一般的な使用例は、複数のチームメンバーが共有ドキュメントで共同作業できるようにするなど、オブジェクトに対するグループ権限を許可することです。これを行うにはいくつかのアプローチがあります。
- グループメンバーに関する追加情報(グループIDなど)を含むFirebaseAuthenticationカスタムトークンを作成します
- ファイルメタデータにグループ情報(グループIDや許可された
uid
のリストなど)を含めます
このデータがトークンまたはファイルのメタデータに保存されると、ルール内から参照できるようになります。
// 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; }
評価をリクエストする
アップロード、ダウンロード、メタデータの変更、削除は、CloudStorageに送信されたrequest
を使用して評価されます。上記のrequest.auth
オブジェクト内のユーザーの一意のIDとFirebaseAuthenticationペイロードに加えて、 request
変数には、リクエストが実行されているファイルパス、リクエストが受信された時刻、および次の場合の新しいresource
値が含まれます。リクエストは書き込みです。 HTTPヘッダーと認証状態も含まれています。
request
オブジェクトには、 request.auth
オブジェクトにユーザーの一意のIDとFirebase Authenticationペイロードも含まれています。これについては、ドキュメントの「ユーザーベースのセキュリティ」セクションで詳しく説明します。
request
オブジェクトのプロパティの完全なリストは、以下にあります。
財産 | タイプ | 説明 |
---|---|---|
auth | map <文字列、文字列> | ユーザーがログインすると、 uid 、ユーザーの一意のID、 token を提供します。これは、Firebase AuthenticationJWTが主張するマップです。それ以外の場合はnull になります。 |
params | map <文字列、文字列> | リクエストのクエリパラメータを含むマップ。 |
path | 道 | リクエストが実行されているpath 表すパス。 |
resource | map <文字列、文字列> | write 要求にのみ存在する新しいリソース値。 |
time | タイムスタンプ | リクエストが評価されるサーバー時間を表すタイムスタンプ。 |
リソース評価
ルールを評価するときは、アップロード、ダウンロード、変更、または削除されるファイルのメタデータを評価することもできます。これにより、特定のコンテンツタイプのファイルのみをアップロードしたり、特定のサイズを超えるファイルのみを削除したりするなど、複雑で強力なルールを作成できます。
Cloud StorageのFirebaseセキュリティルールは、 resource
オブジェクトにファイルメタデータを提供します。これには、CloudStorageオブジェクトに表示されるメタデータのキーと値のペアが含まれます。これらのプロパティは、データの整合性を確保するために、 read
またはwrite
要求で検査できます。
write
リクエスト(アップロード、メタデータの更新、削除など)では、リクエストパスに現在存在するファイルのファイルメタデータを含むresource
オブジェクトに加えて、 request.resource
オブジェクトを使用することもできます。これには、書き込みが許可されている場合に書き込まれるファイルメタデータのサブセットが含まれます。これらの2つの値を使用して、データの整合性を確保したり、ファイルの種類やサイズなどのアプリケーションの制約を適用したりできます。
resource
オブジェクトのプロパティの完全なリストは、以下にあります。
財産 | タイプ | 説明 |
---|---|---|
name | ストリング | オブジェクトのフルネーム |
bucket | ストリング | このオブジェクトが存在するバケットの名前。 |
generation | int | このオブジェクトのGoogleCloudStorageオブジェクトの生成。 |
metageneration | int | このオブジェクトのGoogleCloudStorageオブジェクトのメタ生成。 |
size | int | オブジェクトのサイズ(バイト単位)。 |
timeCreated | タイムスタンプ | オブジェクトが作成された時刻を表すタイムスタンプ。 |
updated | タイムスタンプ | オブジェクトが最後に更新された時刻を表すタイムスタンプ。 |
md5Hash | ストリング | オブジェクトのMD5ハッシュ。 |
crc32c | ストリング | オブジェクトのcrc32cハッシュ。 |
etag | ストリング | このオブジェクトに関連付けられたetag。 |
contentDisposition | ストリング | このオブジェクトに関連付けられているコンテンツの配置。 |
contentEncoding | ストリング | このオブジェクトに関連付けられているコンテンツエンコーディング。 |
contentLanguage | ストリング | このオブジェクトに関連付けられているコンテンツ言語。 |
contentType | ストリング | このオブジェクトに関連付けられているコンテンツタイプ。 |
metadata | map <文字列、文字列> | 追加の開発者指定のカスタムメタデータのキー/値ペア。 |
request.resource
には、 generation
、 metageneration
、 etag
、 timeCreated
、 updated
を除いて、これらすべてが含まれています。
データを検証する
クラウドストレージのFirebaseセキュリティルールは、ファイル名とパス、 contentType
やsize
などのファイルメタデータプロパティの検証など、データの検証にも使用できます。
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セキュリティルールの関数はドメイン固有言語で記述されており、いくつかの重要な制限があります。
- 関数に含めることができる
return
ステートメントは1つだけです。追加のロジックを含めることはできません。たとえば、ループを実行したり、外部サービスを呼び出したりすることはできません。 - 関数は、それらが定義されているスコープから関数と変数に自動的にアクセスできます。たとえば、
service firebase.storage
スコープ内で定義された関数は、resource
変数にアクセスできます。CloudFirestoreの場合のみ、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セキュリティルールで関数を使用すると、ルールの複雑さが増すにつれて、関数の保守が容易になります。
次のステップ
この条件の説明の後、ルールをより高度に理解し、次の準備が整います。
コアユースケースを処理する方法を学び、ルールを開発、テスト、および展開するためのワークフローを学びます。
- 一般的なシナリオに対応するルールを作成します。
- 安全でないルールを見つけて回避する必要がある状況を確認することにより、知識を構築します。
- CloudStorageエミュレーターと専用のセキュリティルールテストライブラリを使用してルールをテストします。
- ルールの展開に使用できる方法を確認します。