Las reglas de seguridad de Firebase proporcionan control de acceso y validación de datos en un formato que admite varios niveles de complejidad. Usa Firebase Authentication con las reglas de seguridad de Firebase para crear sistemas de acceso según la función y los usuarios, que mantengan seguros sus datos.
Identifica los usuarios
La autenticación identifica a los usuarios que solicitan acceso a tus datos y proporciona esa información como una variable que puedes aprovechar en tus reglas. La variable auth
contiene la siguiente información:
uid
: un ID de usuario único, asignado al usuario solicitante.token
: un mapa de valores recopilados por Authentication.
La variable auth.token
contiene los siguientes valores:
Campo | Descripción |
---|---|
email |
Dirección de correo electrónico asociada con la cuenta, si está presente. |
email_verified |
true si el usuario verificó que tiene acceso a la dirección email . Algunos proveedores verifican automáticamente las direcciones de correo electrónico de su propiedad. |
phone_number |
Número de teléfono asociado con la cuenta, si está presente. |
name |
Nombre visible del usuario, si se configuró. |
sub |
UID de Firebase del usuario. Es único dentro de un proyecto. |
firebase.identities |
Diccionario de todas las identidades asociadas con la cuenta del usuario. Las claves del diccionario pueden ser cualquiera de las siguientes: email , phone , google.com , facebook.com , github.com y twitter.com . Los valores del diccionario son arreglos 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 a la cuenta. |
firebase.sign_in_provider |
Proveedor de acceso utilizado para obtener este token. Puede ser una de las siguientes strings: custom , password , phone , anonymous , google.com , facebook.com , github.com y twitter.com . |
firebase.tenant |
El tenantId asociado con la cuenta, si está presente, p. ej., tenant2-m6tyz |
Si deseas agregar atributos de autenticación personalizados, la variable auth.token
también contiene las reclamaciones personalizadas
que especifiques.
Cuando el usuario que solicita el acceso no accedió, la variable auth
es null
.
Puedes aprovechar esto en tus reglas si, por ejemplo, deseas limitar el acceso de lectura a usuarios autenticados: auth != null
. Sin embargo, generalmente recomendamos limitar más el acceso de escritura.
Para obtener más información sobre la variable auth
, consulta la documentación de referencia de Cloud Firestore, Realtime Database y Cloud Storage.
Aprovecha la información del usuario en las reglas
En la práctica, el uso de información autenticada en tus reglas hace que sean más potentes y flexibles. Puedes controlar el acceso a los datos en función de la identidad del usuario.
En tus reglas, define cómo la información en la variable auth
(la información de usuario del solicitante) coincidirá con la información del usuario asociada con los datos solicitados.
Por ejemplo, es posible que tu app se asegure de que los usuarios solo puedan leer y escribir sus propios datos. En esta situación, debes definir una coincidencia entre la variable auth.uid
y el ID de usuario en los datos solicitados:
Cloud Firestore
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;
}
}
}
Realtime Database
{
"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"
}
}
}
}
Cloud Storage
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;
}
}
Define la información de usuario personalizada
Puedes aprovechar aún más la variable auth
para definir los campos personalizados asignados a los usuarios de tu app.
Por ejemplo, supón que quieres crear una función de “administrador” que habilite acceso de escritura en determinadas rutas de acceso. Tendrías que asignar ese atributo a los usuarios y, a continuación, beneficiarte de ellos en las reglas que otorgan acceso a esas rutas.
Puedes agregar un campo personalizado a los documentos de los usuarios en Cloud Firestore y recuperar el valor de ese campo con una lectura incorporada en tus reglas. De esta forma, tu regla basada en la administración se verá de la siguiente manera:
Cloud Firestore
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;
}
}
Puedes acceder a las reclamaciones personalizadas en la sección Reglas después de crear reclamaciones personalizadas en Authentication. Luego,
puedes hacer referencia a esas reclamaciones personalizadas con la variable auth.token
.
Cloud Firestore
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";
}
}
}
Realtime Database
{
"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"
}
}
}
Cloud Storage
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, consulta las reglas de seguridad básicas.