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 typunull
- Prywatny użytkownik: sprawdź, czy
request.auth.uid
równa się ścieżceuid
- 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; } } } }