Catch up on highlights from Firebase at Google I/O 2023. Learn more

Règles de sécurité et authentification Firebase

Les règles de sécurité Firebase fournissent un contrôle d'accès et une validation des données dans un format prenant en charge plusieurs niveaux de complexité. Pour créer des systèmes d'accès basés sur les utilisateurs et les rôles qui protègent les données de vos utilisateurs, utilisez Firebase Authentication avec les règles de sécurité Firebase.

Identifier les utilisateurs

L'authentification identifie les utilisateurs demandant l'accès à vos données et fournit ces informations sous forme de variable que vous pouvez exploiter dans vos règles. La variable auth contient les informations suivantes :

  • uid : ID utilisateur unique, attribué à l'utilisateur demandeur.
  • token : une carte de valeurs collectées par l'authentification.

La variable auth.token contient les valeurs suivantes :

Champ Description
email L'adresse e-mail associée au compte, le cas échéant.
email_verified true si l'utilisateur a vérifié qu'il a accès à l'adresse email . Certains fournisseurs vérifient automatiquement les adresses e-mail qu'ils possèdent.
phone_number Le numéro de téléphone associé au compte, s'il est présent.
name Le nom d'affichage de l'utilisateur, s'il est défini.
sub L'UID Firebase de l'utilisateur. Ceci est unique au sein d'un projet.
firebase.identities Dictionnaire de toutes les identités associées au compte de cet utilisateur. Les clés du dictionnaire peuvent être l'une des suivantes : email , phone , google.com , facebook.com , github.com , twitter.com . Les valeurs du dictionnaire sont des tableaux d'identificateurs uniques pour chaque fournisseur d'identité associé au compte. Par exemple, auth.token.firebase.identities["google.com"][0] contient le premier ID utilisateur Google associé au compte.
firebase.sign_in_provider Le fournisseur de connexion utilisé pour obtenir ce jeton. Il peut s'agir de l'une des chaînes suivantes : custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant Le tenantId associé au compte, s'il est présent. par exemple tenant2-m6tyz

Si vous souhaitez ajouter des attributs d'authentification personnalisés, la variable auth.token contient également les revendications personnalisées que vous spécifiez.

Lorsque l'utilisateur demandant l'accès n'est pas connecté, la variable auth est null . Vous pouvez en tirer parti dans vos règles si, par exemple, vous souhaitez limiter l'accès en lecture aux utilisateurs authentifiés — auth != null . Cependant, nous recommandons généralement de limiter davantage l'accès en écriture.

Pour plus d'informations sur la variable auth , consultez la documentation de référence pour Cloud Firestore , Realtime Database et Cloud Storage .

Exploiter les informations utilisateur dans les règles

En pratique, l'utilisation d'informations authentifiées dans vos règles rend vos règles plus puissantes et plus flexibles. Vous pouvez contrôler l'accès aux données en fonction de l'identité de l'utilisateur.

Dans vos règles, définissez comment les informations de la variable auth (les informations utilisateur du demandeur) correspondent aux informations utilisateur associées aux données demandées.

Par exemple, votre application peut souhaiter s'assurer que les utilisateurs ne peuvent lire et écrire que leurs propres données. Dans ce scénario, vous voudriez une correspondance entre la variable auth.uid et l'ID utilisateur sur les données demandées :

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;
    }
  }
}

Base de données en temps réel

{
  "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"
      }
    }
  }
}

Stockage en ligne

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;
  }
}

Définir des informations utilisateur personnalisées

Vous pouvez également tirer parti de la variable auth pour définir des champs personnalisés attribués aux utilisateurs de votre application.

Par exemple, supposons que vous souhaitiez créer un rôle "admin" qui autorise l'accès en écriture sur certains chemins. Vous attribueriez cet attribut aux utilisateurs, puis l'exploiteriez dans les règles accordant l'accès aux chemins.

Dans Cloud Firestore, vous pouvez ajouter un champ personnalisé aux documents des utilisateurs et récupérer la valeur de ce champ avec une lecture intégrée dans vos règles. Ainsi, votre règle basée sur l'administrateur ressemblerait à l'exemple suivant :

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;
  }
}

Vous pouvez accéder aux revendications personnalisées dans les règles après avoir créé des revendications personnalisées dans l'authentification. Vous pouvez ensuite référencer ces revendications personnalisées à l'aide de la variable 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";
   }
  }
}

Base de données en temps réel

{
  "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"
      }
    }
  }

Stockage en ligne

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;
  }
}

Pour voir plus d'exemples de règles de base utilisant l'authentification, consultez Règles de sécurité de base .