Curso de Firebase: Reglas de Seguridad

Curso Completo de Firebase

Reglas de Seguridad

🔒 Protección de datos

🔑 Autenticación de usuarios

🛡️ Control de acceso

🧪 Pruebas de seguridad

1. Introducción a las reglas de seguridad

Las reglas de seguridad de Firebase son la forma en que protegemos nuestros datos en Firestore y Realtime Database. Actúan como un guardián que decide quién puede leer o escribir qué datos.

¿Por qué son importantes?

Sin reglas de seguridad adecuadas, cualquier persona podría acceder o modificar tus datos, lo que representa un grave riesgo para tu aplicación.

Conceptos clave:

  • Reglas como código: Se escriben en un lenguaje específico similar a JSON o JavaScript.
  • Se ejecutan en el servidor: No pueden ser evitadas desde el cliente.
  • Jerárquicas: Las reglas se aplican en cascada desde rutas padre a rutas hijas.

Advertencia: Las reglas por defecto permiten acceso público a todos tus datos. ¡Nunca dejes tu base de datos en producción con estas reglas!

2. Reglas básicas de lectura y escritura

Las operaciones básicas que podemos controlar son read (lectura) y write (escritura).

Estructura básica para Firestore:

rules_version = '2';

service cloud.firestore {

  match /databases/{database}/documents {

    match /{document=**} {

      allow read, write: if false;

    }

  }

}

Ejemplos de reglas básicas:

Denegar todo el acceso:

allow read, write: if false;

Permitir todo el acceso (no recomendado para producción):

allow read, write: if true;

Permitir solo lectura:

allow read: if true;

allow write: if false;

Ejercicio: Crea una regla que permita escritura pero no lectura. ¿En qué casos podría ser útil esta configuración?

Reglas para rutas específicas:

Podemos aplicar reglas diferentes a diferentes colecciones o documentos:

match /publicaciones/{postId} {

  allow read: if true;

  allow create: if request.auth != null;

  allow update, delete: if request.auth != null && request.auth.uid == resource.data.autorId;

}

3. Reglas basadas en la autenticación

Una de las formas más comunes de proteger datos es vinculándolos a la autenticación de usuarios.

Verificar si el usuario está autenticado:

allow read, write: if request.auth != null;

Acceder a propiedades del usuario:

allow write: if request.auth.token.email_verified == true;

Comparar con el UID del usuario:

// Para datos donde el documento tiene un campo 'userId'

allow read, write: if request.auth != null && request.auth.uid == resource.data.userId;

Roles personalizados:

Podemos implementar un sistema de roles usando claims personalizados:

allow write: if request.auth.token.admin == true;

Ejemplo completo: Reglas para un sistema de blog donde los usuarios solo pueden editar sus propias publicaciones y los administradores pueden editar cualquier cosa.

service cloud.firestore {

  match /databases/{database}/documents {

    match /publicaciones/{postId} {

      allow read: if true;

      allow create: if request.auth != null;

      allow update, delete: if request.auth != null && 

                           (request.auth.uid == resource.data.autorId || 

                            request.auth.token.admin == true);

    }

  }

}

4. Cómo probar tus reglas

Probar las reglas es fundamental para garantizar la seguridad de tu aplicación.

Simulador en Firebase Console:

  1. Ve a la pestaña "Reglas" en Firebase Console.
  2. Haz clic en "Simulador".
  3. Configura el tipo de operación (lectura, escritura).
  4. Especifica la ruta y los datos de autenticación.
  5. Ejecuta la simulación y verifica el resultado.

Pruebas unitarias con el SDK de Firebase:

Puedes escribir pruebas automatizadas para tus reglas:

const firebase = require('@firebase/testing');

beforeEach(async () => {

  const db = await firebase.initializeTestApp({

    projectId: "my-test-project",

    auth: { uid: "alice", email: "alice@example.com" }

  }).firestore();

  

  // Configura datos de prueba

  await db.collection("publicaciones").doc("post1").set({

    autorId: "alice",

    titulo: "Mi primera publicación"

  });

});

it("puede leer sus propias publicaciones", async () => {

  const db = firebase.getFirestore("alice");

  const doc = db.collection("publicaciones").doc("post1");

  await firebase.assertSucceeds(doc.get());

});

Mejores prácticas para probar reglas:

  • Prueba casos de éxito y de fracaso.
  • Prueba con diferentes roles de usuario.
  • Prueba operaciones en lotes y transacciones.
  • Automatiza las pruebas en tu pipeline de CI/CD.

Ejercicio final: Crea un conjunto de reglas para una aplicación de tareas donde:

  • Cualquiera puede leer las tareas marcadas como públicas
  • Los usuarios autenticados pueden crear tareas
  • Solo el creador puede actualizar o eliminar una tarea
  • Los administradores pueden hacer cualquier operación

Luego escribe pruebas para verificar cada uno de estos casos.

Recursos adicionales

Esta entrada forma parte del curso completo de Firebase

Curso completo de Firebase

Publicar un comentario

0 Comentarios