Sicherheitsregeln und Firebase Authentication

Firebase Security Rules bieten Zugriffssteuerung und Datenvalidierung in einem Format, das unterschiedliche Komplexitätsgrade. Um nutzer- und rollenbasierte Zugriffssysteme zu erstellen die dafür sorgen, dass die Firebase Authentication verwenden mit Firebase Security Rules.

Nutzer identifizieren

Authentication identifiziert Nutzer, die Zugriff auf Ihre Daten anfordern, und stellt Folgendes bereit: Informationen als Variable für Ihre Regeln verwenden. Variable auth enthält die folgenden Informationen:

  • uid:Eine eindeutige Nutzer-ID, die dem anfragenden Nutzer zugewiesen wird.
  • token: Eine Zuordnung von Werten, die von Authentication erfasst wurden.

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 ihre E-Mail-Adressen automatisch.
phone_number Die mit dem Konto verknüpfte Telefonnummer, falls vorhanden.
name Der Anzeigename des Nutzers, falls festgelegt.
sub Die Firebase-UID des Nutzers Dies ist innerhalb eines Projekts einmalig.
firebase.identities Wörterbuch aller Identitäten, die dem Konto dieses Nutzers zugeordnet sind. Folgende Schlüssel können verwendet werden: email, phone, google.com, facebook.com, github.com oder twitter.com. Die Werte des Wörterbuchs sind Arrays eindeutiger IDs für jeden Identitätsanbieter, der mit dem Konto verknüpft ist. Beispielsweise enthält auth.token.firebase.identities["google.com"][0] 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. Es kann sich um einen der folgenden Strings handeln: custom, password, phone, anonymous, google.com, facebook.com, github.com oder twitter.com.
firebase.tenant Die mit dem Konto verknüpfte Mandanten-ID (falls vorhanden). z.B. tenant2-m6tyz

Wenn Sie benutzerdefinierte Authentifizierungsattribute hinzufügen möchten, muss die auth.token enthält außerdem beliebige benutzerdefinierte Ansprüche. die Sie angeben.

Wenn der Nutzer, der den Zugriff anfordert, nicht angemeldet ist, lautet die Variable auth null. Nutzen Sie dies in Ihren Regeln, wenn Sie beispielsweise Zugriff für authentifizierte Nutzer: auth != null. Grundsätzlich empfehlen wir jedoch, den Schreibzugriff weiter einschränken.

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

Nutzerinformationen in Regeln verwenden

Wenn Sie authentifizierte Informationen in Ihren Regeln verwenden, noch leistungsfähiger und flexibler. Sie können den Zugriff auf Daten je nach Nutzer festlegen. Identität.

Definieren Sie in Ihren Regeln, wie die Informationen in der Variablen auth – die Nutzerinformationen des Antragstellers – stimmt mit den Nutzerdaten überein, die angeforderten Daten.

Angenommen, Ihre App möchte, dass Nutzer nur ihre Lese- und Schreibzugriffe Ihre eigenen Daten. In diesem Szenario wäre eine Übereinstimmung zwischen den auth.uid und die User-ID der 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;
    }
  }
}

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

Außerdem können Sie mit der Variablen auth benutzerdefinierte Felder definieren, die den Nutzern Ihrer App zugewiesen sind.

Angenommen, Sie möchten einen „Administrator“ erstellen. Rolle, die den Schreibzugriff ermöglicht auf bestimmten Pfaden. Dieses Attribut würden Sie Nutzern zuweisen. und nutzen es dann in den Regeln, die Zugriff auf die Pfade gewähren.

In Cloud Firestore können Sie ein benutzerdefiniertes Feld zu den Dokumente zu erstellen und den Wert dieses Feldes mit einem eingebetteten Lesevorgang in Ihre Regeln. Ihre admin-basierten wie im folgenden Beispiel aus:

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

Du kannst in Rules auf benutzerdefinierte Ansprüche zugreifen, nachdem du in Authentication benutzerdefinierte Ansprüche erstellt hast. Anschließend können Sie auf diese benutzerdefinierten Ansprüche mit der Variablen auth.token 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 mit Authentication findest du unter Grundlegende Sicherheitsregeln.