Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Reglas de seguridad y autenticación de Firebase

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Las reglas de seguridad de Firebase brindan control de acceso y validación de datos en un formato que admite múltiples niveles de complejidad. Para crear sistemas de acceso basados ​​en roles y usuarios que mantengan seguros los datos de sus usuarios, use Firebase Authentication con Firebase Security Rules.

Identificar usuarios

La autenticación identifica a los usuarios que solicitan acceso a sus datos y proporciona esa información como una variable que puede aprovechar en sus reglas. La variable auth contiene la siguiente información:

  • uid : ID de usuario único, asignado al usuario solicitante.
  • token : un mapa de valores recopilados por autenticación.

La variable auth.token contiene los siguientes valores:

Campo Descripción
email La dirección de correo electrónico asociada con la cuenta, si está presente.
email_verified true si el usuario ha verificado que tiene acceso a la dirección de email . Algunos proveedores verifican automáticamente las direcciones de correo electrónico que poseen.
phone_number El número de teléfono asociado con la cuenta, si está presente.
name El nombre para mostrar del usuario, si está configurado.
sub El UID de Firebase del usuario. Esto es único dentro de un proyecto.
firebase.identities Diccionario de todas las identidades asociadas a la cuenta de este usuario. Las claves del diccionario pueden ser cualquiera de las siguientes: email , phone , google.com , facebook.com , github.com , twitter.com . Los valores del diccionario son matrices de identificadores únicos para cada proveedor de identidad asociado con la cuenta. Por ejemplo, auth.token.firebase.identities["google.com"][0] contiene el primer ID de usuario de Google asociado con la cuenta.
firebase.sign_in_provider El proveedor de inicio de sesión utilizado para obtener este token. Puede ser una de las siguientes cadenas: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant TenantId asociado con la cuenta, si está presente. por ejemplo tenant2-m6tyz

Si desea agregar atributos de autenticación personalizados, la variable auth.token también contiene los reclamos personalizados que especifique.

Cuando el usuario que solicita acceso no ha iniciado sesión, la variable auth es null . Puede aprovechar esto en sus reglas si, por ejemplo, desea limitar el acceso de lectura a los usuarios autenticados: auth != null . Sin embargo, generalmente recomendamos limitar aún más el acceso de escritura.

Para obtener más información sobre la variable de auth , consulte la documentación de referencia de Cloud Firestore , Realtime Database y Cloud Storage .

Aproveche la información del usuario en las reglas

En la práctica, el uso de información autenticada en sus reglas hace que sus reglas sean más poderosas y flexibles. Puede controlar el acceso a los datos en función de la identidad del usuario.

En sus reglas, defina cómo la información en la variable auth (la información de usuario del solicitante) coincide con la información de usuario asociada con los datos solicitados.

Por ejemplo, su aplicación puede querer asegurarse de que los usuarios solo puedan leer y escribir sus propios datos. En este escenario, desearía una coincidencia entre la variable auth.uid y el ID de usuario en los datos solicitados:

Tienda de fuego en la nube

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

Base de datos en tiempo real

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

Almacenamiento en la nube

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

Definir información de usuario personalizada

Puede aprovechar aún más la variable de auth para definir campos personalizados asignados a los usuarios de su aplicación.

Por ejemplo, suponga que desea crear un rol de "administrador" que permita el acceso de escritura en ciertas rutas. Asignaría ese atributo a los usuarios y luego lo aprovecharía en las reglas que otorgan acceso a las rutas.

En Cloud Firestore, puede agregar un campo personalizado a los documentos de los usuarios y recuperar el valor de ese campo con una lectura incrustada en sus reglas. Entonces, su regla basada en el administrador se vería como el siguiente ejemplo:

Tienda de fuego en la nube

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

Puede acceder a notificaciones personalizadas en Reglas después de crear notificaciones personalizadas en Autenticación. Luego puede hacer referencia a esos reclamos personalizados usando la variable auth.token .

Tienda de fuego en la nube

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

Base de datos en tiempo real

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

Almacenamiento en la nube

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

Para ver más ejemplos de reglas básicas que aprovechan la autenticación, consulte Reglas de seguridad básicas .