Bezpieczne dane użytkowników

Interfejs Firebase Security Rules dla usługi Cloud Storage integruje się z usługą Firebase Authentication, aby zapewnić zaawansowany uwierzytelnianie oparte na użytkownikach w Cloud Storage. Dzięki temu szczegółowa kontrola dostępu oparta na żądaniach tokena Firebase Authentication.

Uwierzytelnianie użytkowników

Gdy uwierzytelniony użytkownik wysyła żądanie do Cloud Storage, zmienna request.auth jest wypełniana wartością uid użytkownika (request.auth.uid) oraz deklaracji tokena JWT Firebase Authentication (request.auth.token).

Dodatkowo, gdy używasz niestandardowego uwierzytelniania, pojawiają się dodatkowe roszczenia. w polu request.auth.token.

Gdy nieuwierzytelniony użytkownik wykonuje żądanie, zmienna request.auth jest null

Korzystając z tych danych, istnieje kilka popularnych sposobów uwierzytelniania do pliki:

  • Publiczna: ignoruj użytkownika request.auth
  • Uwierzytelniony prywatny: sprawdź, czy request.auth nie jest typu null
  • Prywatny użytkownik: sprawdź, czy request.auth.uid równa się ścieżce uid
  • Grupa prywatna: sprawdź żądania tokena niestandardowego, aby dopasować je do wybranego roszczenia lub odczytać metadane pliku, aby sprawdzić, czy istnieje pole metadanych

Publiczny

Reguła, która nie uwzględnia kontekstu request.auth, może być uznawana za public, ponieważ nie uwzględnia kontekstu uwierzytelniania użytkownika. Reguły te mogą być przydatne przy wyświetlaniu danych publicznych, takich jak zasoby gry, dźwięki pliki i inne treści statyczne.

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

Uwierzytelniony prywatny

W niektórych przypadkach możesz chcieć, aby dane były widoczne dla wszystkich uwierzytelnionych użytkowników przez aplikację, a nie przez nieuwierzytelnionych użytkowników. Od request.auth jest null w przypadku wszystkich nieuwierzytelnionych użytkowników, wystarczy zaznaczyć zmienna request.auth istnieje, aby wymagać uwierzytelniania:

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

Prywatny użytkownik

Najczęstszym przypadkiem użycia request.auth jest podanie indywidualnych danych użytkowników z określonymi uprawnieniami do plików: z przesyłania zdjęć profilowych czytanie dokumentów prywatnych.

Pliki w folderze Cloud Storage mają pełną ścieżkę do pliku, dlatego wystarczy aby plik był kontrolowany przez użytkownika, jest unikalnym identyfikatorem informacje w ścieżce pliku (np. uid użytkownika), które można sprawdzić, gdy reguła jest sprawdzana:

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

Prywatna grupa

Innym równie typowym przypadkiem użycia jest przyznanie uprawnień grupie do obiektu, np. umożliwiając kilku członkom zespołu współpracę nad udostępnionym dokumentem. OK można to zrobić na kilka sposobów:

  • Wygeneruj token niestandardowy Firebase Authentication. zawierający dodatkowe informacje na temat członka grupy (np. identyfikator grupy).
  • Dołącz informacje o grupie (takie jak jej identyfikator lub lista autoryzowanych uid) w metadane pliku,

Gdy te dane zostaną zapisane w tokenie lub metadanych pliku, można się do nich odwoływać z poziomu reguły:

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

Pełny przykład

Przedstawione są proste przypadki z 4 typowymi ograniczeniami uwierzytelniania. w tym przykładzie:

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