Comprende las reglas de seguridad de Firebase Realtime Database

Las reglas de seguridad de Firebase Realtime Database determinan quién tiene acceso de lectura y escritura a tu base de datos, cómo se estructuran los datos y qué índices existen. Estas reglas se alojan en los servidores de Firebase y se aplican automáticamente en todo momento. Cada solicitud de lectura y escritura solo se completará si lo permiten tus reglas. Según la configuración predeterminada, estas no permiten que nadie acceda a tu base de datos, a fin de protegerla de cualquier abuso hasta que tengas tiempo para personalizar tus reglas o configurar la autenticación.

Las reglas de seguridad de Realtime Database tienen una sintaxis similar a la de JavaScript y se presentan en cuatro tipos:

Tipos de reglas
.read Describe si los usuarios pueden leer los datos y cuándo pueden hacerlo.
.write Indica si se permite la escritura de datos y en qué momento.
.validate Define el aspecto de un valor con formato correcto, si este tiene atributos secundarios y el tipo de datos.
.indexOn Especifica un elemento secundario para indexarlo y admitir las solicitudes y las consultas.

Descripción general de la seguridad de Realtime Database

Firebase Realtime Database proporciona un conjunto completo de herramientas para administrar la seguridad de tu app. Estas herramientas facilitan la autenticación de tus usuarios, la aplicación de permisos y la validación de entradas.

Las apps con tecnología de Firebase ejecutan más código en el cliente que las de muchas otras technology stacks. Por lo tanto, la forma de abordar la seguridad puede ser un poco diferente de lo que estás acostumbrado.

Autenticación

Un primer paso común para proteger tu app es identificar a tus usuarios. Este proceso se denomina autenticación. Puedes usar Firebase Authentication para que los usuarios accedan a tu app. Firebase Authentication incluye compatibilidad directa con métodos de autenticación comunes, como Google y Facebook, así como acceso con correo electrónico y contraseña, acceso anónimo y mucho más.

La identidad de los usuarios es un concepto de seguridad importante. Distintos usuarios tienen datos diferentes y, en algunos casos, pueden realizar operaciones diferentes. Por ejemplo, en una aplicación de chat, cada mensaje se asocia con el usuario que lo creó. Es posible que los usuarios también puedan borrar sus propios mensajes, pero no los mensajes que publican otros usuarios.

Autorización

La identificación de tus usuarios no es más que uno de los aspectos de la seguridad. Después de saber quiénes son, debes implementar un método para controlar su acceso a los datos de la base de datos. Las reglas de seguridad de Realtime Database te permiten controlar el acceso de cada usuario. Por ejemplo, a continuación se muestra un conjunto de reglas de seguridad que permite que cualquier usuario lea la ruta de acceso /foo/, pero no que escriba en ella:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Las reglas .read y .write se aplican en cascada, por lo que este conjunto de reglas otorga acceso de lectura a cualquier dato en la ruta de acceso /foo/, junto con cualquier otra ruta de acceso más profunda, como /foo/bar/baz. Ten en cuenta que las reglas .read y .write de nivel más alto en la base de datos anulan las reglas más profundas. Por eso, en este ejemplo se otorga acceso de lectura a /foo/bar/baz incluso si hay una regla en la ruta de acceso /foo/bar/baz que indica el valor “false”.

Las reglas de seguridad de Realtime Database incluyen funciones y variables integradas que te permiten hacer referencia a otras rutas de acceso, marcas de tiempo del servidor, información de autenticación y mucho más. A continuación se muestra un ejemplo de una regla que otorga acceso de escritura para usuarios autenticados a /users/<uid>/. En esta ruta <uid> es el ID del usuario que se obtuvo a través de Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Validación de datos

Firebase Realtime Database no usa esquemas. Esto facilita los cambios durante la etapa de desarrollo, pero una vez que tu app está lista para distribuirla, es importante que los datos se mantengan coherentes. El lenguaje de reglas incluye una regla .validate que te permite aplicar la lógica de validación con las mismas expresiones que se usan para las reglas .read y .write. La única diferencia es que las reglas de validación no se aplican en cascada, por lo que todas las reglas de validación relevantes se deben evaluar como verdaderas para que se permita la escritura.

Según estas reglas, los datos escritos en /foo/ deben corresponder a una string con menos de 100 caracteres:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Las reglas de validación tienen acceso a todas las mismas funciones y variables integradas que las reglas .read y .write. Puedes usarlas para crear reglas de validación que consideren los datos de otra ubicación de tu base de datos, la identidad de tus usuarios, la hora del servidor y mucho más.

Define los índices de la base de datos

Firebase Realtime Database permite solicitar y consultar datos. Para los datos pequeños, la base de datos admite consultas ad hoc, por lo que, comúnmente, los índices no son necesarios durante el desarrollo. Sin embargo, antes de lanzar tu app, es importante que especifiques índices para todas las consultas a fin de garantizar que sigan funcionando mientras tu app crece.

Los índices se especifican con la regla .indexOn. A continuación, se muestra un ejemplo de una declaración que indexaría los campos de altura y longitud en una lista de dinosaurios:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Próximos pasos