Ir a la consola

Explicación de las reglas de Firebase Realtime Database

Las reglas 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 de manera automática 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 del abuso hasta que tengas tiempo para personalizar tus reglas o configurar la autenticación.

Las reglas 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 se permite.
.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 usuarios, aplican los permisos de usuario y validan las entradas.

Las apps con tecnología de Firebase ejecutan más código en el cliente que aquellas con muchas otras pilas de tecnología. 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 utilizar Firebase Authentication para que los usuarios accedan a tu app. Firebase Authentication tiene compatibilidad directa con los métodos comunes de autenticación, como Google y Facebook, al igual que acceso con correo electrónico y contraseña, acceso anónimo y 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, necesitas un método para controlar su acceso a los datos de la base de datos. Las reglas de Realtime Database te permiten controlar el acceso de cada usuario. Por ejemplo, a continuación, te mostramos un conjunto de reglas de seguridad que permiten 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 /foo/ junto con cualquier otra ruta 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 Realtime Database incluyen variables integradas y funciones que te permiten hacer referencia a otras rutas de acceso, marcas de tiempo en el servidor, información de autenticación y más. A continuación, te mostramos un ejemplo de una regla que garantiza el acceso de escritura para usuarios autenticados a /users/<uid>/, en la que <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 distribuir, es importante que los datos se mantengan coherentes. El lenguaje de reglas incluye una regla .validate que te permite aplicar 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 las mismas variables y funciones 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"]
    }
  }
}

Pasos siguientes