Reglas de seguridad de Firebase

Las reglas de seguridad de la base de datos en tiempo real de Firebase son la forma en que protege sus datos de usuarios no autorizados y protege su estructura de datos.  

En este tutorial de sugerencias rápidas, explicaré cómo configurar correctamente las reglas de seguridad de su base de datos para que solo los usuarios autorizados tengan acceso de lectura o escritura a los datos. También le mostraré cómo estructurar sus datos para facilitar la seguridad.

El problema

Supongamos que tenemos datos JSON en nuestra base de datos Firebase, como en el siguiente ejemplo:

"users": "user1": "firstName": "Chike", "lastName": "Mgbemena", "age": "89" "phoneNumber": "07012345678", "user2": "firstName ":" Godswill "," lastName ":" Okwara "," age ":" 12 "" phoneNumber ":" 0701234 "," user3 ": " firstName ":" Onu "," lastName ": 543," age ": 90" phoneNumber ":" 07012345678 ",…

Al mirar la base de datos, puede ver que hay algunos problemas con nuestros datos:

  1. Dos usuarios (usuario1 y usuario3) tienen los mismos números de teléfono. Nos gustaría que estos sean únicos..
  2. usuario3 tiene un número para el apellido, en lugar de una cadena.
  3. usuario2 tiene solo siete dígitos en su número de teléfono, en lugar de 11. 
  4. El valor de edad para usuario1 y usuario2 es una cadena, mientras que la de usuario3 es un numero.

Con todos estos defectos resaltados en nuestros datos, hemos perdido la integridad de los datos. En los siguientes pasos, le mostraré cómo evitar que ocurran estos. 

Reglas permisivas

La base de datos en tiempo real de Firebase tiene los siguientes tipos de reglas:

Tipo Función
.leer Describe si los usuarios pueden leer los datos y cuándo..
.escribir Describa cuándo y cuándo se permite escribir los datos..
.validar Define cómo se verá un valor correctamente formateado, si tiene atributos secundarios y el tipo de datos.
.indexon Especifica un hijo para indexar para admitir pedidos y consultas.

Lea más sobre ellos en los documentos de Firebase.

Aquí hay una regla muy permisiva para el usuarios clave en nuestra base de datos. 

"rules": "users": // los usuarios son legibles por cualquier persona ".read": true, // los usuarios pueden escribirlos por cualquier persona ".write": true

Esto es malo, porque le da a cualquiera la capacidad de leer o escribir datos en la base de datos. Cualquiera puede acceder al camino. / usuarios / así como caminos más profundos. No solo eso, sino que no se impone ninguna estructura a los datos de los usuarios..

Reglas de control de acceso

"rules": "users": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", 

Con estas reglas, controlamos el acceso a los registros de usuarios a los usuarios que han iniciado sesión. No solo eso, sino que los usuarios solo pueden leer o escribir sus propios datos. Hacemos esto con un comodín: $ uid. Esta es una variable que representa la clave secundaria (los nombres de las variables comienzan con PS). Por ejemplo, accediendo a la ruta. / usuarios / usuario1, $ uid es "usuario1"

A continuación, hacemos uso de la autenticación variable, que representa al usuario actualmente autenticado. Esta es una variable de servidor predefinida suministrada por Firebase. En las líneas 5 y 6, aplicamos una restricción de accesibilidad que solo el usuario autenticado con la misma identificación que el registro de usuario puede leer o escribir sus datos. En otras palabras, para cada usuario, el acceso de lectura y escritura se otorga a / usuarios //, dónde representa el ID de usuario actualmente autenticado.

Otras variables del servidor Firebase son:  

ahora La hora actual en milisegundos desde la época de Linux..
raíz UNA RuleDataSnapshot representa la ruta de acceso raíz en la base de datos de Firebase tal como existe antes de la operación intentada. 
nuevos datos UNA RuleDataSnapshot representando los datos tal como existirían después de la operación intentada. Incluye los nuevos datos que se están escribiendo y los datos existentes.. 
datos Una RuleDataSnapshot que representa los datos tal como existían antes de la operación intentada.
autenticación Representa la carga útil del token de un usuario autenticado.

Lea más sobre estas y otras variables de servidor en los documentos de Firebase.

Aplicación de la estructura de datos

También podemos usar las reglas de Firebase para imponer restricciones a los datos en nuestra base de datos. 

Por ejemplo, en las siguientes reglas, en las líneas 8 y 11, garantizamos que cualquier nuevo valor para el nombre y apellido debe ser una cadena. En la línea 14, nos aseguramos de que la edad sea un número. Finalmente, en las líneas 17 y 18, estamos haciendo cumplir que el valor del número de teléfono debe ser una cadena y de longitud 11.

"rules": "users": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", "firstName" : ".validate": "newData.isString ()", "lastName": ".validate": "newData.isString ()", "age": ".validate": "newData.isNumber ( ) "," phoneNumber ": " .validate ":" newData.isString () && newData.val (). length == 11 ",

Pero, ¿cómo evitamos números de teléfono duplicados??

Prevención de duplicados

A continuación, te mostraré cómo prevenir números de teléfono duplicados.

Paso 1: Normalizar la estructura de datos

Lo primero que debemos hacer es modificar la ruta raíz para incluir un nivel superior /números de teléfono/ nodo. Entonces, al crear un nuevo usuario, también agregaremos el número de teléfono del usuario a este nodo cuando la validación sea exitosa. Nuestra nueva estructura de datos se verá como la siguiente:

"users": "user1": "firstName": "Chike", "lastName": "Mgbemena", "age": 89, "phoneNumber": "07012345678", "user2": "firstName" : "Godswill", "lastName": "Okwara", "age": 12, "phoneNumber": "06034345453", "user3": "firstName": "Onu", "lastName": "Emeka", " age ": 90," phoneNumber ":" 09034564543 ",…," phoneNumbers ": " 07012345678 ":" user1 "," 06034345453 ":" user2 "," 09034564543 ":" user3 ",… 

Paso 2: Hacer cumplir la nueva estructura de datos

Necesitamos modificar las reglas de seguridad para imponer la estructura de datos: 

"rules": "users": "$ uid": … "phoneNumber": ".validate": "newData.isString () && newData.val (). length == 11 &&! root.child ('phoneNumbers'). child (newData.val ()). existir () ",

Aquí, nos aseguramos de que el número de teléfono sea único al verificar si ya es un hijo de /números de teléfono/ nodo con el número de teléfono dado como clave. En otras palabras, estamos verificando que el número de teléfono no haya sido registrado por un usuario ya. Si no lo ha hecho, entonces la validación es exitosa y la operación de escritura será aceptada; de lo contrario, será rechazada. 

Su aplicación deberá agregar el número de teléfono a la lista de números de teléfono al crear un nuevo usuario, y deberá eliminar el número de teléfono de un usuario si ese usuario es eliminado.

Simulación de reglas de validación y seguridad

Puede simular sus reglas de seguridad en la consola Firebase haciendo clic en Simulador botón. Agregue sus reglas de seguridad, seleccione el tipo de simulación (lectura o escritura), ingrese algunos datos con una ruta y haga clic en correr botón: 

Si el valor del primer nombre es un número en lugar de una cadena, la validación fallará y se deniega el acceso de escritura:

Conclusión

En este tutorial de consejos rápidos, aprendió acerca de las reglas de seguridad de la base de datos Firebase: cómo evitar el acceso no autorizado a los datos y cómo asegurarse de que los datos en la base de datos estén estructurados.

Para obtener más información sobre las reglas de seguridad de la base de datos Firebase, consulte la documentación oficial. Y echa un vistazo a algunos de nuestros otros tutoriales y cursos de Firebase aquí en Envato Tuts+!