Firebase セキュリティ ルールでは、さまざまなレベルの複雑さをサポートする形でアクセス制御とデータ検証を行うことができます。ユーザーのデータを保護するユーザーベースのアクセス システムと役割ベースのアクセス システムを構築するには、Firebase セキュリティ ルールで Firebase Authentication を使用します。
ユーザーを識別する
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 |
存在する場合、アカウントに関連付けられている tenantId(例: tenant2-m6tyz )。 |
カスタマイズした認証属性を追加する必要がある場合は、指定するカスタム クレームも auth.token
変数に含めます。
アクセスをリクエストしているユーザーがログインしていない場合、auth
変数は null
になります。たとえば、読み取りアクセスを認証済みユーザーに制限する場合は、auth != null
をルールで利用できます。ただし、通常は書き込みアクセスをさらに制限することをおすすめします。
auth
変数の詳細については、Cloud Firestore、Realtime Database、Cloud Storage のリファレンス ドキュメントをご覧ください。
ルールでユーザー情報を利用する
ルールで実際に認証情報を使用すると、ルールがより強力かつ柔軟になります。ユーザー ID に基づいてデータへのアクセスを制御できます。
ルール内で、auth
変数に含まれる情報(リクエスト送信者のユーザー情報)を、リクエスト対象のデータに関連付けられているユーザー情報と照合する方法を定義します。
たとえば、アプリでユーザーが読み取りや書き込みを行えるデータを、そのユーザーが所有するデータのみに制限するとします。このシナリオでは、auth.uid
変数とリクエスト対象のデータのユーザー ID が一致する必要があります。
Cloud Firestore
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;
}
}
}
Realtime Database
{
"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"
}
}
}
}
Cloud Storage
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
変数を利用して、アプリのユーザーに割り当てたカスタム フィールドを定義することもできます。
たとえば、特定のパスに対して書き込みアクセスを可能にする「admin」の役割を作成するとします。この属性をユーザーに割り当てたうえで、ルール内でこの属性を利用して、パスへのアクセス権を付与します。
Cloud Firestore では、ユーザーのドキュメントにカスタム フィールドを追加し、ルールに埋め込んだ read を使用してそのフィールドの値を取得できます。したがって、admin ベースのルールは次の例に示すような内容になります。
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] でカスタム クレームを作成した後は、[ルール] でカスタム クレームにアクセスできます。これらのカスタム クレームは、auth.token
変数を使用して参照できます。
Cloud Firestore
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";
}
}
}
Realtime Database
{
"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"
}
}
}
Cloud Storage
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;
}
}
Authentication を利用した基本的なセキュリティ ルールの他の例については、基本的なセキュリティ ルールをご覧ください。