Regole di sicurezza e Firebase Authentication

Firebase Security Rules forniscono il controllo dell'accesso e la convalida dei dati in un formato che supporta diversi livelli di complessità. Per creare sistemi di accesso basati su utenti e ruoli che proteggono i dati degli utenti, utilizza Firebase Authentication con Firebase Security Rules.

Identificare gli utenti

Authentication identifica gli utenti che richiedono l'accesso ai tuoi dati e fornisce queste informazioni come variabile che puoi utilizzare nelle tue regole. La variabile auth contiene le seguenti informazioni:

  • uid: un ID utente univoco assegnato all'utente che effettua la richiesta.
  • token: una mappa dei valori raccolti da Authentication.

La variabile auth.token contiene i seguenti valori:

Campo Descrizione
email L'indirizzo email associato all'account, se presente.
email_verified true se l'utente ha verificato di avere accesso all'indirizzo email. Alcuni fornitori verificano automaticamente gli indirizzi email di loro proprietà.
phone_number Il numero di telefono associato all'account, se presente.
name Il nome visualizzato dell'utente, se impostato.
sub L'UID Firebase dell'utente. Deve essere univoco all'interno di un progetto.
firebase.identities Dizionario di tutte le identità associate all'account di questo utente. Le chiavi del dizionario possono essere una delle seguenti: email, phone, google.com, facebook.com, github.com, twitter.com. I valori del dizionario sono array di identificatori univoci per ogni provider di identità associato all'account. Ad esempio, auth.token.firebase.identities["google.com"][0] contiene il primo ID utente Google associato all'account.
firebase.sign_in_provider Il provider di accesso utilizzato per ottenere questo token. Può essere una delle seguenti stringhe: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant Il tenantId associato all'account, se presente. Ad es. tenant2-m6tyz

Se vuoi aggiungere attributi di autenticazione personalizzati, la variabile auth.token contiene anche eventuali claim personalizzati da te specificati.

Quando l'utente che richiede l'accesso non ha eseguito l'accesso, la variabile auth è null. Puoi sfruttare questa funzionalità nelle tue regole se, ad esempio, vuoi limitare l'accesso in lettura agli utenti autenticati (auth != null). Tuttavia, consigliamo in genere di limitare ulteriormente l'accesso in scrittura.

Per ulteriori informazioni sulla variabile auth, consulta la documentazione di riferimento per Cloud Firestore, Realtime Database e Cloud Storage.

Utilizzare le informazioni utente nelle regole

In pratica, l'utilizzo di informazioni autenticate nelle regole le rende più efficaci e flessibili. Puoi controllare l'accesso ai dati in base all'identità dell'utente.

Nelle regole, definisci in che modo le informazioni nella variabile auth, ovvero le informazioni utente del richiedente, corrispondono alle informazioni utente associate ai dati richiesti.

Ad esempio, potresti voler assicurarti che gli utenti possano leggere e scrivere solo i propri dati. In questo caso, è consigliabile una corrispondenza tra la variabile auth.uid e l'ID utente nei dati richiesti:

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

Definire informazioni utente personalizzate

Puoi sfruttare ulteriormente la variabile auth per definire campi personalizzati assegnati agli utenti della tua app.

Ad esempio, supponiamo di voler creare un ruolo "amministratore" che consenta l'accesso in scrittura su determinati percorsi. Assegnerai questo attributo agli utenti e poi lo utilizzerai nelle regole che concedono l'accesso ai percorsi.

In Cloud Firestore, puoi aggiungere un campo personalizzato ai documenti degli utenti e recuperare il valore di quel campo con una lettura incorporata nelle regole. Pertanto, la regola basata sull'amministratore avrà il seguente aspetto:

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

Puoi accedere alle rivendicazioni personalizzate in Rules dopo aver creato le rivendicazioni personalizzate in Authentication. Puoi quindi fare riferimento a questi claim personalizzati utilizzando la variabile 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;
  }
}

Per altri esempi di utilizzo di Rules di base per Authentication, consulta Regole di sicurezza di base.