Nutzerdaten schützen

Firebase Security Rules für Cloud Storage wird in Firebase Authentication eingebunden, um Folgendes bereitzustellen: leistungsstarke, nutzerbasierte Authentifizierung bei Cloud Storage. So ist eine detaillierte Zugriffssteuerung basierend auf den Berechtigungen eines Firebase Authentication-Tokens möglich.

Nutzerauthentifizierung

Wenn ein authentifizierter Nutzer eine Anfrage an Cloud Storage stellt, Die Variable request.auth wird mit dem uid des Nutzers gefüllt (request.auth.uid) sowie die Anforderungen des Firebase Authentication-JWT (request.auth.token).

Außerdem werden bei Verwendung der benutzerdefinierten Authentifizierung zusätzliche Ansprüche angezeigt. im Feld request.auth.token ein.

Wenn ein nicht authentifizierter Nutzer eine Anfrage ausführt, wird die Variable request.auth null.

Es gibt mehrere gängige Methoden, mithilfe der Authentifizierung Dateien:

  • Öffentlich: request.auth ignorieren
  • Privat authentifiziert: Prüfen Sie, ob request.auth nicht null ist
  • Nutzerprivat: Prüfen Sie, ob request.auth.uid einem Pfad uid entspricht.
  • Gruppe privat: Prüfen, ob die Behauptungen des benutzerdefinierten Tokens mit einer ausgewählten Behauptung übereinstimmen, oder die Dateimetadaten lesen, um zu prüfen, ob ein Metadatenfeld vorhanden ist

Öffentlich

Jede Regel, bei der der request.auth-Kontext nicht berücksichtigt wird, kann als public-Regel betrachtet werden, da der Authentifizierungskontext des Nutzers nicht berücksichtigt wird. Diese Regeln können nützlich sein, um öffentliche Daten wie Game-Assets, Audiodateien oder andere statische Inhalte zu präsentieren.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

Authentifiziert als privat

In bestimmten Fällen möchten Sie möglicherweise, dass Daten für alle authentifizierten Nutzer Ihrer Anwendung sichtbar sind, aber nicht für nicht authentifizierte Nutzer. Seit dem request.auth ist null für alle nicht authentifizierten Nutzer. Sie müssen nur die Die Variable request.auth ist vorhanden, damit eine Authentifizierung erforderlich ist:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

Nur für Nutzer sichtbar

Der mit Abstand häufigste Anwendungsfall für request.auth besteht darin, einzelnen Nutzern detaillierte Berechtigungen für ihre Dateien zuzuweisen, vom Hochladen von Profilbildern bis zum Lesen privater Dokumente.

Da Dateien in Cloud Storage einen vollständigen Pfad zur Datei haben, ist für die Steuerung einer Datei durch einen Nutzer nur eine eindeutige, den Nutzer identifizierende Information im Dateipfad erforderlich (z. B. die uid des Nutzers), die bei der Auswertung der Regel geprüft werden kann:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth != null && request.auth.uid == userId;
}

Gruppe privat

Ein weiterer, ebenso häufiger Anwendungsfall ist die Zulassung von Gruppenberechtigungen für ein Objekt. z. B. um mehreren Teammitgliedern die Zusammenarbeit an einem freigegebenen Dokument zu ermöglichen. Es gibt es mehrere Ansätze:

Sobald diese Daten in den Token- oder Dateimetadaten gespeichert sind, können sie in einer Regel referenziert werden:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

Vollständiges Beispiel

Einfache Fälle der vier häufigsten Arten von Authentifizierungseinschränkungen werden gezeigt. im Beispiel unten:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Anyone can view any image (no auth, publicly readable)
      match /{allImages=**} {
        allow read;
      }

      // Only authenticated users can write to "public" images
      match /public/{imageId} {
        allow write: if request.auth != null;
      }

      // Only an individual user can write to "their" images
      match /{userId}/{imageId} {
        allow write: if request.auth.uid == userId;
      }

      // Allow a "group" of users to read/write to shared images
      // An owner metadata property on the object contains the groupId for reads
      // A custom token has been minted with a groupId property for writes
      match /{groupId}/{imageId} {
        allow read: if resource.metadata.owner == request.auth.token.groupId;
        allow write: if request.auth.token.groupId == groupId;
      }
    }
  }
}