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 Firebase Authentication mit Firebase Security Rules.

Identifizieren Sie Benutzer

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 Karte von Werten, die von der Authentifizierung erfasst 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 E-Mail-Adressen.
phone_number Die mit dem Konto verknüpfte Telefonnummer, falls vorhanden.
name Der Anzeigename des Benutzers, falls festgelegt.
sub Die Firebase-UID des Benutzers. Dies ist innerhalb eines Projekts einzigartig.
firebase.identities Wörterbuch aller Identitäten, die mit dem Konto dieses Benutzers verknüpft 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 Google-Benutzer-ID, die mit dem Konto verknüpft ist.
firebase.sign_in_provider Der Anmeldeanbieter, der zum Erhalten dieses Tokens verwendet wurde. Kann eine der folgenden Zeichenfolgen sein: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant Die mit dem Konto verknüpfte Mieter-ID, falls vorhanden. z. tenant2-m6tyz

Wenn Sie benutzerdefinierte Authentifizierungsattribute hinzufügen möchten, enthält die Variable auth.token auch alle benutzerdefinierten Ansprüche, die Sie angeben.

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

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

Nutzen Sie Benutzerinformationen in Regeln

In der Praxis werden Ihre Regeln durch die Verwendung authentifizierter Informationen 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 – die Benutzerinformationen des Anforderers – mit den Benutzerinformationen übereinstimmen, die den angeforderten Daten zugeordnet sind.

Beispielsweise möchte Ihre App möglicherweise 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;
    }
  }
}

Echtzeitdatenbank

{
  "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 außerdem nutzen, um benutzerdefinierte Felder zu definieren, die den Benutzern Ihrer App zugewiesen werden.

Angenommen, Sie möchten eine „Administrator“-Rolle erstellen, die 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 den Dokumenten der Benutzer 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 der Authentifizierung erstellt haben . Sie können diese benutzerdefinierten Ansprüche dann mithilfe der Variablen auth.token referenzieren.

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

Echtzeitdatenbank

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