Reguły bezpieczeństwa i uwierzytelnianie Firebase

Reguły zabezpieczeń Firebase zapewniają kontrolę dostępu i weryfikację danych w formacie obsługującym wiele poziomów złożoności. Aby zbudować w oparciu o użytkownika i systemów dostępowych opartych na rolach, które bezpiecznego przechowywania danych użytkowników, należy użyć uwierzytelniania Firebase z Firebase zasad bezpieczeństwa.

Zidentyfikuj użytkowników

Uwierzytelnianie identyfikuje użytkowników żądających dostępu do Twoich danych i udostępnia te informacje jako zmienną, którą możesz wykorzystać w swoich regułach. auth zmienna zawiera następujące informacje:

  • uid : Unikalny identyfikator użytkownika przypisany do żądającego użytkownika.
  • token : Mapa wartości zebranych przez uwierzytelniania.

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

Pole Opis
email Adres e-mail powiązany z kontem, jeśli jest obecny.
email_verified true jeśli użytkownik zweryfikował mają dostęp do email adres. Niektórzy dostawcy automatycznie weryfikują swoje adresy e-mail.
phone_number Numer telefonu powiązany z kontem, jeśli jest obecny.
name Wyświetlana nazwa użytkownika, jeśli jest ustawiona.
sub UID Firebase użytkownika. Jest to unikatowe w ramach projektu.
firebase.identities Słownik wszystkich tożsamości powiązanych z kontem tego użytkownika. Kluczami słownika może być dowolny z następujących: email , phone , google.com , facebook.com , github.com , twitter.com . Wartości słownika to tablice unikalnych identyfikatorów dla każdego dostawcy tożsamości skojarzonego z kontem. Na przykład, auth.token.firebase.identities["google.com"][0] zawiera pierwszy identyfikator pomocną związanego z rachunku.
firebase.sign_in_provider Dostawca logowania używany do uzyskania tego tokenu. Może być jednym z następujących ciągów: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .

Jeśli chcesz dodać niestandardowe atrybuty uwierzytelnieniu, auth.token zmienna zawiera również żadnych własnych roszczeń określone przez użytkownika.

Gdy dostęp żądania użytkownik nie zalogujesz, auth zmienna jest null . Można wykorzystać to w swoich zasadach, jeśli na przykład chcesz ograniczyć dostęp do odczytu uwierzytelnionych użytkowników - auth != null . Jednak ogólnie zalecamy dalsze ograniczanie dostępu do zapisu.

Aby uzyskać więcej informacji na temat auth zmiennej, zobacz dokumentację referencyjną chmurze FireStore , Realtime Database i Cloud Storage .

Wykorzystaj informacje o użytkowniku w regułach

W praktyce użycie w regułach informacji uwierzytelnionych sprawia, że ​​reguły są bardziej wydajne i elastyczne. Możesz kontrolować dostęp do danych na podstawie tożsamości użytkownika.

W swoich zasad, określić, jak informacje zawarte w auth zmiennej - informacje użytkownika żądającego za - dopasowuje informacje użytkownika związane z żądanych danych.

Na przykład Twoja aplikacja może chcieć, aby użytkownicy mogli tylko odczytywać i zapisywać własne dane. W tym scenariuszu, co chcesz mecz pomiędzy auth.uid zmiennej i identyfikatora użytkownika na żądane dane:

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żna dodatkowo wykorzystać auth zmiennej zdefiniować niestandardowe pola przypisane do użytkowników swojej aplikacji.

Załóżmy na przykład, że chcesz utworzyć rolę „admin”, która umożliwia dostęp do zapisu w określonych ścieżkach. Przypisałbyś ten atrybut użytkownikom, a następnie wykorzystał 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. Tak więc Twoja reguła administracyjna wyglądałaby jak w następującym 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;
  }
}

Do Regulaminu w czasie rzeczywistym bazy danych i Cloud Storage, tworzenie własnych roszczeń uwierzytelniania. Następnie można odwołać te niestandardowe roszczeń za pomocą auth.token zmienną.

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 zasad wykorzystujących uwierzytelniania, zobacz Reguły podstawowe bezpieczeństwo .