Reguły zabezpieczeń i Uwierzytelnianie Firebase

Firebase Security Rules zapewniają kontrolę dostępu i weryfikację danych w formacie, który obsługuje 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żywaj Firebase Authentication z Firebase Security Rules.

Identyfikowanie użytkowników

Authentication identyfikuje użytkowników, którzy proszą o dostęp do Twoich danych, i udostępnia te informacje jako zmienną, której możesz używać w regułach. Zmienna auth zawiera te informacje:

  • uid: unikalny identyfikator użytkownika przypisany do użytkownika wysyłającego żądanie.
  • token: mapa wartości zebranych przez Authentication.

Zmienna auth.token zawiera te wartości:

Pole Opis
email Adres e-mail powiązany z kontem, jeśli jest dostępny.
email_verified true, jeśli użytkownik potwierdził, że ma dostęp do adresu email. Niektórzy dostawcy automatycznie weryfikują adresy e-mail, których są właścicielami.
phone_number Numer telefonu powiązany z kontem, jeśli jest dostępny.
name Wyświetlana nazwa użytkownika, jeśli została ustawiona.
sub Identyfikator UID Firebase użytkownika. Jest on unikalny w obrębie projektu.
firebase.identities Słownik wszystkich tożsamości powiązanych z kontem tego użytkownika. Klucze słownika mogą być dowolnymi z tych wartości: email, phone, google.com, facebook.com, github.com, twitter.com. Wartości słownika to tablice unikalnych identyfikatorów 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 tokena. Może to być jeden z tych ciągów znaków: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant Identyfikator tenantId powiązany z kontem, jeśli jest dostępny. Przykład: tenant2-m6tyz.

Jeśli chcesz dodać niestandardowe atrybuty uwierzytelniania, auth.token zmienna zawiera też wszystkie niestandardowe deklaracje określone przez Ciebie.

Gdy użytkownik wysyłający żądanie dostępu nie jest zalogowany, zmienna auth ma wartość null. Możesz to wykorzystać w regułach, jeśli na przykład chcesz ograniczyć dostęp do odczytu tylko do uwierzytelnionych użytkowników – auth != null. Zalecamy jednak dalsze ograniczanie dostępu do zapisu.

Więcej informacji o zmiennej auth znajdziesz w dokumentacji referencyjnej Cloud Firestore, Realtime Database i Cloud Storage.

Wykorzystywanie informacji o użytkownikach w regułach

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

W regułach określ, jak informacje w zmiennej auth – informacje o użytkowniku wysyłającym żądanie – pasują do informacji o użytkowniku powiązanych z żądanymi danymi.

Na przykład aplikacja może wymagać, aby użytkownicy mogli tylko odczytywać i zapisywać własne dane. W takim przypadku musisz dopasować zmienną auth.uid do identyfikatora 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;
    }
  }
}

Realtime Database

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

Cloud Storage

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

Określanie niestandardowych informacji o użytkownikach

Możesz dodatkowo wykorzystać zmienną auth, aby zdefiniować pola niestandardowe przypisane do użytkowników aplikacji.

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

W Cloud Firestore możesz dodać pole niestandardowe do dokumentów użytkowników i pobrać wartość tego pola za pomocą wbudowanego odczytu w regułach. Reguła oparta na administratorze będzie wyglądać tak jak w tym 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;
  }
}

Po utworzeniu niestandardowych deklaracji w Authentication możesz uzyskać do nich dostęp w Security Rules. Następnie możesz odwołać się do tych niestandardowych deklaracji za pomocą 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";
   }
  }
}

Realtime Database

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

Cloud Storage

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

Więcej przykładów podstawowych Security Rules wykorzystujących Authentication znajdziesz w artykule Podstawowe reguły zabezpieczeń.