Regole di sicurezza e autenticazione Firebase

Le regole di sicurezza Firebase forniscono il controllo degli accessi e la convalida dei dati in un formato che supporta più livelli di complessità. Per creare sistemi di accesso basati su utenti e ruoli che mantengano i dati degli utenti al sicuro, utilizza l'autenticazione Firebase con le regole di sicurezza Firebase.

Identificare gli utenti

L'autenticazione identifica gli utenti che richiedono l'accesso ai tuoi dati e fornisce tali informazioni come variabile che puoi sfruttare nelle tue regole. La variabile auth contiene le seguenti informazioni:

  • uid : un ID utente univoco, assegnato all'utente richiedente.
  • token : una mappa di 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 provider 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. Questo è unico all'interno di un progetto.
firebase.identities Dizionario di tutte le identità associate all'account di questo utente. I tasti del dizionario possono essere uno dei seguenti: email , phone , google.com , facebook.com , github.com , twitter.com . I valori del dizionario sono matrici di identificatori univoci per ciascun 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 esempio tenant2-m6tyz

Se desideri aggiungere attributi di autenticazione personalizzati, la variabile auth.token contiene anche eventuali attestazioni personalizzate specificate.

Quando l'utente che richiede l'accesso non ha effettuato l'accesso, la variabile auth è null . Puoi sfruttare questo aspetto nelle tue regole se, ad esempio, desideri limitare l'accesso in lettura agli utenti autenticati: auth != null . Tuttavia, in genere consigliamo 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 .

Sfrutta le informazioni dell'utente nelle regole

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

Nelle regole, definisci il modo in cui le informazioni nella variabile auth (le informazioni dell'utente del richiedente) corrispondono alle informazioni dell'utente associate ai dati richiesti.

Ad esempio, la tua app potrebbe voler assicurarsi che gli utenti possano leggere e scrivere solo i propri dati. In questo scenario, vorresti una corrispondenza tra la variabile auth.uid e l'ID utente sui dati richiesti:

Cloud Fire Store

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

Banca dati in tempo reale

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

Archiviazione nel cloud

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 le informazioni utente personalizzate

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

Si supponga, ad esempio, di voler creare un ruolo "amministratore" che consenta l'accesso in scrittura su determinati percorsi. Assegni quell'attributo agli utenti e poi lo sfrutti nelle regole che garantiscono 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 tue regole. Pertanto, la tua regola basata sull'amministratore sarebbe simile al seguente esempio:

Cloud Fire Store

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

È possibile accedere alle attestazioni personalizzate in Regole dopo aver creato attestazioni personalizzate in Autenticazione. È quindi possibile fare riferimento a tali attestazioni personalizzate utilizzando la variabile auth.token .

Cloud Fire Store

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

Banca dati in tempo reale

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

Archiviazione nel cloud

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 vedere altri esempi di regole di base che sfruttano l'autenticazione, consulta Regole di sicurezza di base .