As regras de segurança do Firebase fornecem controle de acesso e validação de dados em um formato compatível com vários níveis de complexidade. Para criar sistemas de acesso baseados em usuário e função que mantêm os dados de seus usuários seguros, use o Firebase Authentication with Firebase Security Rules.
Identificar usuários
A autenticação identifica os usuários que solicitam acesso aos seus dados e fornece essas informações como uma variável que você pode aproveitar em suas regras. A variável auth
contém as seguintes informações:
-
uid
: Um ID de usuário exclusivo, atribuído ao usuário solicitante. -
token
: Um mapa de valores coletados pela Autenticação.
A variável auth.token
contém os seguintes valores:
Campo | Descrição |
---|---|
email | O endereço de e-mail associado à conta, se presente. |
email_verified | true se o usuário tiver verificado que tem acesso ao endereço de email . Alguns provedores verificam automaticamente os endereços de e-mail que possuem. |
phone_number | O número de telefone associado à conta, se presente. |
name | O nome de exibição do usuário, se definido. |
sub | O UID do Firebase do usuário. Isso é único dentro de um projeto. |
firebase.identities | Dicionário de todas as identidades associadas à conta deste usuário. As chaves do dicionário podem ser qualquer uma das seguintes: email , phone , google.com , facebook.com , github.com , twitter.com . Os valores do dicionário são matrizes de identificadores exclusivos para cada provedor de identidade associado à conta. Por exemplo, auth.token.firebase.identities["google.com"][0] contém o primeiro ID de usuário do Google associado à conta. |
firebase.sign_in_provider | O provedor de login usado para obter esse token. Pode ser uma das seguintes strings: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant | O tenantId associado à conta, se presente. por exemplo tenant2-m6tyz |
Se você deseja adicionar atributos de autenticação personalizados, a variável auth.token
também contém quaisquer declarações personalizadas que você especificar.
Quando o usuário que está solicitando acesso não está conectado, a variável auth
é null
. Você pode aproveitar isso em suas regras se, por exemplo, quiser limitar o acesso de leitura a usuários autenticados — auth != null
. No entanto, geralmente recomendamos limitar ainda mais o acesso de gravação.
Para obter mais informações sobre a variável auth
, consulte a documentação de referência para Cloud Firestore , Realtime Database e Cloud Storage .
Aproveite as informações do usuário nas regras
Na prática, usar informações autenticadas em suas regras as torna mais poderosas e flexíveis. Você pode controlar o acesso aos dados com base na identidade do usuário.
Em suas regras, defina como as informações na variável auth
— as informações do usuário do solicitante — correspondem às informações do usuário associadas aos dados solicitados.
Por exemplo, seu aplicativo pode querer garantir que os usuários só possam ler e gravar seus próprios dados. Nesse cenário, você deseja uma correspondência entre a variável auth.uid
e o ID do usuário nos dados 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;
}
}
}
banco de dados em tempo real
{
"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"
}
}
}
}
Armazenamento na núvem
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;
}
}
Definir informações personalizadas do usuário
Você pode aproveitar ainda mais a variável auth
para definir campos personalizados atribuídos aos usuários do seu aplicativo.
Por exemplo, suponha que você deseja criar uma função "admin" que permita o acesso de gravação em determinados caminhos. Você atribuiria esse atributo aos usuários e, em seguida, o aproveitaria nas regras que concedem acesso nos caminhos.
No Cloud Firestore, você pode adicionar um campo personalizado aos documentos dos usuários e recuperar o valor desse campo com uma leitura incorporada em suas regras. Portanto, sua regra baseada em administrador se pareceria com o exemplo a seguir:
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;
}
}
Você pode acessar declarações personalizadas em Regras depois de criar declarações personalizadas em Autenticação. Você pode fazer referência a essas declarações personalizadas usando a variável 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";
}
}
}
banco de dados em tempo real
{
"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"
}
}
}
Armazenamento na núvem
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 mais exemplos de regras básicas que aproveitam a autenticação, consulte Regras básicas de segurança .