Regole di sicurezza e Firebase Authentication

Firebase Security Rules fornisce il controllo dell'accesso e la convalida dei dati in un formato che supporta più livelli di complessità. Creare sistemi di accesso basati sugli utenti e sui ruoli che mantengono agli utenti la sicurezza dei dati, utilizza Firebase Authentication con Firebase Security Rules.

Identifica 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. Variabile auth contiene le seguenti informazioni:

  • uid: un ID utente univoco assegnato all'utente che ha inviato 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. È 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.

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

Per saperne di più sulla variabile auth, consulta il riferimento documentazione di Cloud Firestore, Realtime Database e Cloud Storage

Utilizzo delle informazioni sugli utenti nelle regole

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

Nelle regole, definisci in che modo le informazioni nella variabile auth, ovvero informazioni sull'utente del richiedente: corrispondono alle informazioni dell'utente associate al i dati richiesti.

Ad esempio, potresti voler fare in modo che gli utenti possano solo leggere e scrivere i propri dati personali. In questo scenario, è necessario trovare una corrispondenza tra auth.uid e l'ID utente sui 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;
  }
}

Definisci informazioni utente personalizzate

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

Ad esempio, supponiamo di voler creare un "amministratore" che abilita l'accesso in scrittura su determinati percorsi. Assegni questo attributo agli utenti e e poi sfruttarlo nelle regole che concedono l'accesso ai percorsi.

In Cloud Firestore, puoi aggiungere un campo personalizzato al documenti e recuperare valore di quel campo con una lettura incorporata nelle regole. Quindi, le persone che si affidano all'amministratore sarà simile al seguente esempio:

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 rivendicazioni personalizzate in Authentication. Puoi quindi fare riferimento alle rivendicazioni personalizzate 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 base di Rules che sfrutta Authentication, consulta Regole di sicurezza di base.