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 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 のいずれかの文字列です。

カスタマイズした認証属性を追加する必要がある場合は、指定するカスタム クレーム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;
  }
}

Realtime Database と Cloud Storage のセキュリティ ルールでは、Authentication でカスタム クレームを作成します。これらのカスタム クレームは、auth.token 変数を使用して参照できます。

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