Reguły bezpieczeństwa i uwierzytelnianie Firebase

Reguły bezpieczeństwa Firebase zapewniają kontrolę dostępu i sprawdzanie poprawności danych w formacie obsługującym wiele poziomów złożoności. Aby tworzyć systemy dostępu oparte na użytkownikach i rolach, które chronią dane użytkowników, użyj uwierzytelniania Firebase z regułami bezpieczeństwa Firebase.

Zidentyfikuj użytkowników

Uwierzytelnianie identyfikuje użytkowników proszących o dostęp do Twoich danych i zapewnia te informacje jako zmienną, którą możesz wykorzystać w swoich regułach. Zmienna auth zawiera następujące informacje:

  • uid : unikalny identyfikator użytkownika przypisany do użytkownika żądającego.
  • token : mapa wartości zebranych przez uwierzytelnianie.

Zmienna auth.token zawiera następujące wartości:

Pole Opis
email Adres e-mail powiązany z kontem, jeśli istnieje.
email_verified true Jeśli użytkownik potwierdził, że ma dostęp do adresu email . Niektórzy dostawcy automatycznie weryfikują posiadane adresy e-mail.
phone_number Numer telefonu powiązany z kontem, jeśli istnieje.
name Wyświetlana nazwa użytkownika, jeśli jest ustawiona.
sub Identyfikator użytkownika Firebase. Jest to unikatowe w ramach projektu.
firebase.identities Słownik wszystkich tożsamości powiązanych z kontem tego użytkownika. Klucze słownika mogą być dowolne z następujących: email , phone , google.com , facebook.com , github.com , twitter.com . Wartości słownika to tablice unikatowych identyfikatorów dla każdego dostawcy tożsamości powiązanego z kontem. Na przykład auth.token.firebase.identities["google.com"][0] zawiera pierwszy identyfikator użytkownika Google powiązany z kontem.
firebase.sign_in_provider Dostawca logowania użyty do uzyskania tego tokenu. Może to być jeden z następujących ciągów znaków: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant Ten identyfikator skojarzony z kontem, jeśli istnieje. np tenant2-m6tyz

Jeśli chcesz dodać niestandardowe atrybuty uwierzytelniania, zmienna auth.token zawiera również wszelkie określone przez Ciebie niestandardowe oświadczenia .

Gdy użytkownik żądający dostępu nie jest zalogowany, zmienna auth ma wartość null . Możesz wykorzystać to w swoich regułach, jeśli na przykład chcesz ograniczyć dostęp do odczytu do uwierzytelnionych użytkowników — auth != null . Jednak generalnie zalecamy dalsze ograniczanie dostępu do zapisu.

Aby uzyskać więcej informacji o zmiennej auth , zapoznaj się z dokumentacją referencyjną Cloud Firestore , Realtime Database i Cloud Storage .

Wykorzystaj informacje o użytkownikach w regułach

W praktyce użycie uwierzytelnionych informacji w regułach zwiększa ich skuteczność i elastyczność. Możesz kontrolować dostęp do danych na podstawie tożsamości użytkownika.

W swoich regułach zdefiniuj, w jaki sposób informacje w zmiennej auth — informacje o użytkowniku żądającego — pasują do informacji o użytkowniku powiązanych z żądanymi danymi.

Na przykład Twoja aplikacja może chcieć upewnić się, że użytkownicy mogą tylko odczytywać i zapisywać własne dane. W tym scenariuszu potrzebne byłoby dopasowanie między zmienną auth.uid a identyfikatorem użytkownika w żądanych danych:

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

Baza danych czasu rzeczywistego

{
  "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"
      }
    }
  }
}

Magazyn w chmurze

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

Zdefiniuj niestandardowe informacje o użytkowniku

Możesz dodatkowo wykorzystać zmienną auth do definiowania niestandardowych pól przypisanych do użytkowników Twojej aplikacji.

Załóżmy na przykład, że chcesz utworzyć rolę „administratora”, która umożliwia dostęp do zapisu w określonych ścieżkach. Przypisałbyś ten atrybut użytkownikom, a następnie wykorzystałbyś go w regułach przyznających dostęp do ścieżek.

W Cloud Firestore możesz dodać niestandardowe pole do dokumentów użytkowników i pobrać wartość tego pola z osadzonym odczytem w swoich regułach. Twoja reguła oparta na administratorze wyglądałaby tak, jak w poniższym przykładzie:

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

Możesz uzyskać dostęp do niestandardowych oświadczeń w Regułach po utworzeniu niestandardowych oświadczeń w Uwierzytelnianiu. Następnie możesz odwoływać się do tych niestandardowych oświadczeń przy użyciu zmiennej auth.token .

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

Baza danych czasu rzeczywistego

{
  "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"
      }
    }
  }

Magazyn w chmurze

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

Aby zobaczyć więcej przykładów podstawowych reguł wykorzystujących uwierzytelnianie, zobacz Podstawowe zasady bezpieczeństwa .