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ários e funções que mantenham os dados dos usuários seguros, use o Firebase Authentication com regras de segurança do Firebase.
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 nas 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 email . Alguns provedores verificam automaticamente os endereços de e-mail de sua propriedade. |
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ê quiser adicionar atributos de autenticação customizados, a variável auth.token
também conterá quaisquer declarações customizadas que você especificar.
Quando o usuário que solicita 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 do Cloud Firestore , do Realtime Database e do Cloud Storage .
Aproveite as informações do usuário nas regras
Na prática, usar informações autenticadas em suas regras torna-as mais poderosas e flexíveis. Você pode controlar o acesso aos dados com base na identidade do usuário.
Nas 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. Neste cenário, você desejaria uma correspondência entre a variável auth.uid
e o ID do usuário nos dados solicitados:
Cloud Fire Store
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ê queira criar uma função “admin” que permita acesso de gravação em determinados caminhos. Você atribuiria esse atributo aos usuários e depois o aproveitaria nas regras que concedem acesso aos 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 nas suas regras. Portanto, sua regra baseada em administrador seria semelhante ao exemplo a seguir:
Cloud Fire Store
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 então fazer referência a essas declarações personalizadas usando a variável auth.token
.
Cloud Fire Store
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 .