セキュリティ ルールと Firebase Authentication

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 の辞書。辞書のキーは、emailphonegoogle.comfacebook.comgithub.comtwitter.com のいずれかです。辞書の値は、アカウントに関連付けられている各 ID プロバイダの一意の識別子からなる配列です。たとえば、auth.token.firebase.identities["google.com"][0] にはアカウントに関連付けられている最初の Google ユーザー ID が含まれます。
firebase.sign_in_provider このトークンを取得するために使用されたログイン プロバイダ。custompasswordphoneanonymousgoogle.comfacebook.comgithub.comtwitter.com のいずれかの文字列です。
firebase.tenant 存在する場合、アカウントに関連付けられている tenantId(例: tenant2-m6tyz)。

カスタマイズした認証属性を追加する必要がある場合は、指定するカスタム クレームauth.token 変数に含めます。

アクセスをリクエストしているユーザーがログインしていない場合、auth 変数は null になります。たとえば、読み取りアクセスを認証済みユーザーに制限する場合は、auth != null をルールで利用できます。ただし、通常は書き込みアクセスをさらに制限することをおすすめします。

auth 変数の詳細については、Cloud FirestoreRealtime DatabaseCloud 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 を利用した基本的なセキュリティ ルールの他の例については、基本的なセキュリティ ルールをご覧ください。