Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

セキュリティルールとFirebase認証

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 のディクショナリ。ディクショナリのキーは、次のいずれかになります: 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アカウントに関連付けられているテナント ID (存在する場合)。例: tenant2-m6tyz

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

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

auth変数の詳細については、 Cloud FirestoreRealtime 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;
  }
}

認証を利用する基本的なルールの例をさらに確認するには、「基本的なセキュリティ ルール」を参照してください。