Sicherheitsregeln und Firebase Authentication

Firebase Security Rules bieten Zugriffssteuerung und Datenvalidierung in einem Format, das mehrere Komplexitätsstufen unterstützt. Verwenden Sie Firebase Authentication mit Firebase Security Rules, um nutzer- und rollenbasierte Zugriffssysteme zum Schutz der Nutzerdaten zu erstellen.

Nutzer identifizieren

Mit Authentication werden Nutzer identifiziert, die Zugriff auf Ihre Daten anfordern. Diese Informationen werden als Variable bereitgestellt, die Sie in Ihren Regeln verwenden können. Die Variable auth enthält die folgenden Informationen:

  • uid:Eine eindeutige Nutzer-ID, die dem anfragenden Nutzer zugewiesen ist.
  • token:Eine Zuordnung von Werten, die von Authentication 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 Nutzer bestätigt hat, dass er Zugriff auf die Adresse email hat. Einige Anbieter bestätigen automatisch E-Mail-Adressen, die ihnen gehören.
phone_number Die mit dem Konto verknüpfte Telefonnummer, falls vorhanden.
name Der Anzeigename des Nutzers, falls festgelegt.
sub Die Firebase-UID des Nutzers. Sie ist innerhalb eines Projekts eindeutig.
firebase.identities Verzeichnis aller Identitäten, die mit dem Konto dieses Nutzers verknüpft sind. Die Schlüssel des Dictionarys können einer der folgenden Werte sein: email, phone, google.com, facebook.com, github.com, twitter.com. Die Werte des Dictionary sind Arrays mit eindeutigen Kennungen für jeden Identitätsanbieter, der mit dem Konto verknüpft ist. auth.token.firebase.identities["google.com"][0] enthält beispielsweise die erste Google-Nutzer-ID, die mit dem Konto verknüpft ist.
firebase.sign_in_provider Der Anmeldeanbieter, der zum Abrufen dieses Tokens verwendet wurde. 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 „tenantId“, falls vorhanden, z. B.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 Nutzer, der Zugriff anfordert, nicht angemeldet ist, ist die Variable auth gleich null. Sie können dies in Ihren Regeln nutzen, wenn Sie beispielsweise den Lesezugriff auf authentifizierte Nutzer beschränken möchten – auth != null. Wir empfehlen jedoch, den Schreibzugriff weiter einzuschränken.

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

Nutzerinformationen in Regeln verwenden

In der Praxis werden Ihre Regeln durch die Verwendung authentifizierter Informationen leistungsfähiger und flexibler. Sie können den Zugriff auf Daten anhand der Nutzeridentität steuern.

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

So kann beispielsweise dafür gesorgt werden, dass Nutzer nur ihre eigenen Daten lesen und schreiben können. In diesem Fall sollte die Variable auth.uid mit der Nutzer-ID in den angeforderten Daten übereinstimmen:

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

Benutzerdefinierte Nutzerinformationen definieren

Sie können die Variable auth auch verwenden, um benutzerdefinierte Felder zu definieren, die den Nutzern Ihrer App zugewiesen sind.

Angenommen, Sie möchten eine Administratorrolle erstellen, die Schreibzugriff auf bestimmte Pfade ermöglicht. Sie weisen das Attribut Nutzern zu und verwenden es dann in den Regeln, mit denen der Zugriff auf die Pfade gewährt wird.

In Cloud Firestore können Sie den Dokumenten von Nutzern ein benutzerdefiniertes Feld hinzufügen und den Wert dieses Felds mit einem eingebetteten Lesevorgang in Ihren Regeln abrufen. Ihre administratorbasierte Regel würde also so 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 in Rules auf benutzerdefinierte Ansprüche zugreifen, nachdem Sie benutzerdefinierte Ansprüche in Authentication erstellt haben. Sie können dann mit der Variablen auth.token auf diese benutzerdefinierten Anforderungen 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";
   }
  }
}

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

Weitere Beispiele für einfache Rules, die Authentication nutzen, finden Sie unter Einfache Sicherheitsregeln.