Firebase セキュリティ ルールは、複数レベルの複雑さをサポートする形式で、アクセス制御とデータ検証を提供します。ユーザーのデータを安全に保つユーザーベースおよびロールベースのアクセス システムを構築するには、Firebase セキュリティ ルールでFirebase Authenticationを使用します。
ユーザーの識別
認証は、データへのアクセスを要求しているユーザーを識別し、その情報をルールで利用できる変数として提供します。 auth
変数には、次の情報が含まれています。
-
uid
:要求しているユーザーに割り当てられた一意のユーザー ID。 -
token
: Authentication によって収集された値のマップ。
auth.token
変数には次の値が含まれます。
分野 | 説明 |
---|---|
email | アカウントに関連付けられている電子メール アドレス (存在する場合)。 |
email_verified | ユーザーがemail アドレスにアクセスできることを確認した場合はtrue 。一部のプロバイダーは、所有する電子メール アドレスを自動的に確認します。 |
phone_number | アカウントに関連付けられている電話番号 (存在する場合)。 |
name | 設定されている場合、ユーザーの表示名。 |
sub | ユーザーの Firebase UID。これは、プロジェクト内で一意です。 |
firebase.identities | このユーザーのアカウントに関連付けられているすべての ID のディクショナリ。ディクショナリのキーは、次のいずれかになります: email 、 phone 、 google.com 、 facebook.com 、 github.com 、 twitter.com 。ディクショナリの値は、アカウントに関連付けられた各 ID プロバイダーの一意の識別子の配列です。たとえば、 auth.token.firebase.identities["google.com"][0] には、アカウントに関連付けられた最初の Google ユーザー ID が含まれます。 |
firebase.sign_in_provider | このトークンを取得するために使用されるサインイン プロバイダー。次の文字列のいずれかになります: custom 、 password 、 phone 、 anonymous 、 google.com 、 facebook.com 、 github.com 、 twitter.com 。 |
firebase.tenant | アカウントに関連付けられているテナント ID (存在する場合)。例: tenant2-m6tyz |
カスタマイズされた認証属性を追加する場合、 auth.token
変数には、指定したカスタム クレームも含まれます。
アクセスを要求しているユーザーがサインインしていない場合、 auth
変数はnull
です。たとえば、認証されたユーザーに読み取りアクセスを制限する場合は、ルールでこれを利用できます — auth != null
。ただし、通常は、書き込みアクセスをさらに制限することをお勧めします。
auth
変数の詳細については、 Cloud Firestore 、 Realtime Database 、およびCloud Storageのリファレンス ドキュメントを参照してください。
ルールでユーザー情報を活用する
実際には、ルールで認証された情報を使用すると、ルールがより強力で柔軟になります。ユーザー ID に基づいてデータへのアクセスを制御できます。
ルールで、 auth
変数の情報 (リクエスターのユーザー情報) が、要求されたデータに関連付けられたユーザー情報とどのように一致するかを定義します。
たとえば、アプリで、ユーザーが自分のデータのみを読み書きできるようにする必要がある場合があります。このシナリオでは、要求されたデータのauth.uid
変数とユーザー ID が一致する必要があります。
クラウド ファイアストア
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
リアルタイム データベース
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
クラウドストレージ
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
カスタム ユーザー情報を定義する
auth
変数をさらに活用して、アプリのユーザーに割り当てられるカスタム フィールドを定義できます。
たとえば、特定のパスへの書き込みアクセスを可能にする「管理者」ロールを作成するとします。その属性をユーザーに割り当て、パスへのアクセスを許可するルールでそれを活用します。
Cloud Firestore では、ユーザーのドキュメントにカスタム フィールドを追加し、ルールに埋め込まれた読み取りでそのフィールドの値を取得できます。したがって、管理者ベースのルールは次の例のようになります。
クラウド ファイアストア
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin) == true;
read: if request.auth != null;
}
}
Authentication でカスタム クレームを作成した後、Rules でカスタム クレームにアクセスできます。その後、 auth.token
変数を使用して、これらのカスタム クレームを参照できます。
クラウド ファイアストア
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
リアルタイム データベース
{
"rules": {
"some_path/$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true"
".read": "auth.uid !== null"
}
}
}
クラウドストレージ
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
認証を利用する基本的なルールの例をさらに確認するには、「基本的なセキュリティ ルール」を参照してください。