Güvenlik Kuralları ve Firebase Authentication

Firebase Security Rules, birden fazla karmaşıklık düzeyini destekleyen bir biçimde erişim denetimi ve veri doğrulaması sağlar. Kullanıcılarınızın verilerini güvende tutan kullanıcıya dayalı ve role dayalı erişim sistemleri oluşturmak için Firebase Security Rules ile Firebase Authentication kullanın.

Kullanıcıları tanımlama

Authentication, verilerinize erişim isteyen kullanıcıları tanımlar ve bu bilgileri kurallarınızda kullanabileceğiniz bir değişken olarak sağlar. auth değişkeni aşağıdaki bilgileri içerir:

  • uid: İstekte bulunan kullanıcıya atanan benzersiz bir kullanıcı kimliği.
  • token: Authentication tarafından toplanan değerlerin haritası.

auth.token değişkeni aşağıdaki değerleri içerir:

Alan Açıklama
email Hesapla ilişkili e-posta adresi (varsa).
email_verified Kullanıcı email adresine erişimi olduğunu doğruladıysa true. Bazı sağlayıcılar sahip oldukları e-posta adreslerini otomatik olarak doğrular.
phone_number Hesapla ilişkili telefon numarası (varsa).
name Ayarlanmışsa kullanıcının görünen adı.
sub Kullanıcının Firebase UID'si. Bu, proje içinde benzersizdir.
firebase.identities Bu kullanıcının hesabıyla ilişkili tüm kimliklerin sözlüğü. Sözlük anahtarları şunlardan herhangi biri olabilir: email, phone, google.com, facebook.com, github.com, twitter.com. Sözlüğün değerleri, hesapla ilişkili her kimlik sağlayıcı için benzersiz tanımlayıcı dizileridir. Örneğin, auth.token.firebase.identities["google.com"][0], hesapla ilişkili ilk Google kullanıcı kimliğini içerir.
firebase.sign_in_provider Bu jetonu almak için kullanılan oturum açma sağlayıcısı. Aşağıdaki dizelerden biri olabilir: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant Hesapla ilişkili kiracı kimliği (varsa). ör. tenant2-m6tyz

Özelleştirilmiş kimlik doğrulama özellikleri eklemek istiyorsanız auth.token değişkeni, belirttiğiniz tüm özel iddiaları da içerir.

Erişim isteyen kullanıcı oturum açmamışsa auth değişkeni null olur. Örneğin, okuma erişimini kimliği doğrulanmış kullanıcılarla (auth != null) sınırlamak istiyorsanız bu özelliği kurallarınızda kullanabilirsiniz. Ancak genellikle yazma erişimini daha da sınırlandırmanızı öneririz.

auth değişkeni hakkında daha fazla bilgi için Cloud Firestore, Realtime Database ve Cloud Storage referans belgelerine bakın.

Kurallarda kullanıcı bilgilerinden yararlanma

Pratikte, kurallarınızda kimliği doğrulanmış bilgiler kullanmak, kurallarınızı daha güçlü ve esnek hale getirir. Verilere erişimi kullanıcı kimliğine göre kontrol edebilirsiniz.

Kurallarınızda, auth değişkenindeki bilgilerin (istekte bulunanın kullanıcı bilgileri) istenen verilerle ilişkili kullanıcı bilgileriyle nasıl eşleştiğini tanımlayın.

Örneğin, uygulamanız kullanıcıların yalnızca kendi verilerini okuyup yazabilmesini isteyebilir. Bu senaryoda, auth.uid değişkeni ile istenen verilerdeki kullanıcı kimliği arasında eşleşme olmasını istersiniz:

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

Özel kullanıcı bilgilerini tanımlama

Uygulamanızın kullanıcılarına atanan özel alanları tanımlamak için auth değişkeninden daha fazla yararlanabilirsiniz.

Örneğin, belirli yollarda yazma erişimi sağlayan bir "yönetici" rolü oluşturmak istediğinizi varsayalım. Bu özelliği kullanıcılara atar ve ardından yollarda erişim izni veren kurallarda bu özellikten yararlanırsınız.

Cloud Firestore'te, kullanıcıların dokümanlarına özel bir alan ekleyebilir ve kurallarınıza yerleştirilmiş bir okuma işlevi kullanarak bu alanın değerini alabilirsiniz. Bu nedenle, yöneticiye dayalı kuralınız aşağıdaki örnek gibi görünür:

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

Authentication'da özel iddialar oluşturduktan sonra Rules'te özel iddialara erişebilirsiniz. Ardından, auth.token değişkenini kullanarak bu özel iddialara referans verebilirsiniz.

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

Authentication'dan yararlanan temel Rules ile ilgili daha fazla örnek görmek için Temel Güvenlik Kuralları bölümüne bakın.