Firebase Security Rules fournit un contrôle des accès et une validation des données dans un format compatible avec 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 Firebase Security Rules.
Identifier les utilisateurs
Authentication identifie les utilisateurs qui demandent l'accès à vos données et fournit ces informations sous la forme d'une 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: mappage des valeurs collectées par Authentication.
La variable auth.token contient les valeurs suivantes :
| Champ | Description |
|---|---|
email |
Adresse e-mail associée au compte, le cas échéant. |
email_verified |
true si l'utilisateur a confirmé qu'il avait accès à l'adresse email. Certains fournisseurs valident automatiquement les adresses e-mail qu'ils possèdent. |
phone_number |
Numéro de téléphone associé au compte, le cas échéant. |
name |
Nom à afficher de l'utilisateur, s'il est défini. |
sub |
ID utilisateur Firebase de l'utilisateur. Il 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'identifiants 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 |
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 |
ID du locataire associé au compte, le cas échéant (par exemple, tenant2-m6tyz). |
Si vous souhaitez ajouter des attributs d'authentification personnalisés, la variable auth.token contient également toutes les revendications personnalisées que vous spécifiez.
Lorsque l'utilisateur qui demande 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). Toutefois, nous vous recommandons généralement de limiter davantage l'accès en écriture.
Pour en savoir plus sur la variable auth, consultez la documentation de référence sur 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 les rend 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 la correspondance entre les informations de la variable auth (les informations utilisateur du demandeur) et les informations utilisateur associées aux données demandées.
Par exemple, votre application peut vouloir s'assurer que les utilisateurs ne peuvent lire et écrire que leurs propres données. Dans ce scénario, vous souhaitez 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;
}
}
}
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;
}
}
Définir des informations utilisateur personnalisées
Vous pouvez également exploiter 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 d'accès. Vous attribuez cet attribut aux utilisateurs, puis vous l'utilisez dans les règles accordant l'accès aux chemins d'accès.
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. Votre règle basée sur l'administrateur ressemblera donc à 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 Security Rules après avoir créé des revendications personnalisées dans Authentication. 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";
}
}
}
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;
}
}
Pour voir d'autres exemples de règles de sécurité Security Rules de base exploitant Authentication, consultez Règles de sécurité de base.