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

Sicherheitsregeln und Firebase-Authentifizierung

Firebase-Sicherheitsregeln bieten Zugriffskontrolle und Datenvalidierung in einem Format, das mehrere Komplexitätsebenen unterstützt. Um benutzerbasierte und rollenbasierte Zugriffssysteme zu erstellen, die die Daten Ihrer Benutzer schützen, verwenden Sie die Firebase-Authentifizierung mit Firebase-Sicherheitsregeln.

Benutzer identifizieren

Die Authentifizierung identifiziert Benutzer, die Zugriff auf Ihre Daten anfordern, und stellt diese Informationen als Variable bereit, die Sie in Ihren Regeln nutzen können. Die auth Variable enthält die folgenden Informationen:

  • uid : Eine eindeutige Benutzer-ID, die dem anfragenden Benutzer zugewiesen wird.
  • token : Eine Zuordnung von Werten, die von der Authentifizierung gesammelt werden.

Die Variable auth.token enthält die folgenden Werte:

Feld Beschreibung
email Die mit dem Konto verknüpfte E-Mail-Adresse, falls vorhanden.
email_verified true , wenn der Benutzer bestätigt hat, dass er Zugriff auf die email Adresse hat. Einige Anbieter verifizieren automatisch ihre eigenen E-Mail-Adressen.
phone_number Die dem Konto zugeordnete Telefonnummer, falls vorhanden.
name Der Anzeigename des Benutzers, falls festgelegt.
sub Die Firebase-UID des Benutzers. Dies ist einmalig innerhalb eines Projektes.
firebase.identities Wörterbuch aller Identitäten, die diesem Benutzerkonto zugeordnet sind. Die Schlüssel des Wörterbuchs können folgende sein: email , phone , google.com , facebook.com , github.com , twitter.com . Die Werte des Wörterbuchs sind Arrays eindeutiger Kennungen für jeden mit dem Konto verknüpften Identitätsanbieter. Beispielsweise enthält auth.token.firebase.identities["google.com"][0] die erste mit dem Konto verknüpfte Google-Benutzer-ID.
firebase.sign_in_provider Der zum Abrufen dieses Tokens verwendete Anmeldeanbieter. Kann einer der folgenden Strings sein: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant Die mit dem Konto verknüpfte Mandanten-ID, falls vorhanden. zB tenant2-m6tyz

Wenn Sie angepasste Authentifizierungsattribute hinzufügen möchten, enthält die Variable auth.token auch alle von Ihnen angegebenen benutzerdefinierten Ansprüche .

Wenn der Benutzer, der den Zugriff anfordert, nicht angemeldet ist, ist die Variable auth null . Sie können dies in Ihren Regeln nutzen, wenn Sie beispielsweise den Lesezugriff auf authentifizierte Benutzer beschränken möchten – auth != null . Wir empfehlen jedoch generell, den Schreibzugriff weiter einzuschränken.

Weitere Informationen zur Variablen auth finden Sie in der Referenzdokumentation für Cloud Firestore , Realtime Database und Cloud Storage .

Nutzen Sie Benutzerinformationen in Regeln

In der Praxis macht die Verwendung authentifizierter Informationen in Ihren Regeln Ihre Regeln leistungsfähiger und flexibler. Sie können den Zugriff auf Daten basierend auf der Benutzeridentität steuern.

Definieren Sie in Ihren Regeln, wie die Informationen in der auth Variablen – die Benutzerinformationen des Anforderers – mit den Benutzerinformationen übereinstimmen, die den angeforderten Daten zugeordnet sind.

Ihre App möchte beispielsweise sicherstellen, dass Benutzer nur ihre eigenen Daten lesen und schreiben können. In diesem Szenario möchten Sie eine Übereinstimmung zwischen der Variablen auth.uid und der Benutzer-ID für die angeforderten Daten:

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

Echtzeit-Datenbank

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

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

Definieren Sie benutzerdefinierte Benutzerinformationen

Sie können die auth Variable weiter nutzen, um benutzerdefinierte Felder zu definieren, die den Benutzern Ihrer App zugewiesen sind.

Angenommen, Sie möchten eine „Admin“-Rolle erstellen, die den Schreibzugriff auf bestimmte Pfade ermöglicht. Sie würden dieses Attribut Benutzern zuweisen und es dann in den Regeln nutzen, die den Zugriff auf die Pfade gewähren.

In Cloud Firestore können Sie Benutzerdokumenten ein benutzerdefiniertes Feld hinzufügen und den Wert dieses Felds mit einem eingebetteten Lesevorgang in Ihren Regeln abrufen. Ihre admin-basierte Regel würde also wie im folgenden Beispiel aussehen:

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

Sie können auf benutzerdefinierte Ansprüche in Regeln zugreifen, nachdem Sie benutzerdefinierte Ansprüche in Authentifizierung erstellt haben . Sie können dann mit der Variablen auth.token auf diese benutzerdefinierten Ansprüche verweisen.

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

Echtzeit-Datenbank

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

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

Weitere Beispiele für grundlegende Regeln, die die Authentifizierung nutzen, finden Sie unter Grundlegende Sicherheitsregeln .