Ir para o console

Regras de segurança e o Firebase Authentication

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 com base em usuários e papéis que protegem os dados dos usuários, use o Firebase Authentication com as regras de segurança do Firebase.

Identificar usuários

O Authentication identifica os usuários que solicitam acesso aos seus dados e fornece essas informações como uma variável que pode ser utilizada nas suas regras. A variável auth contém as seguintes informações:

  • uid: um código de usuário exclusivo, atribuído ao usuário solicitante.
  • token: um mapa de valores coletados pelo Authentication.

A variável auth.token contém os seguintes valores:

Campo Descrição
email O endereço de e-mail associado à conta, se essa informação existir.
email_verified true se o usuário tiver verificado que tem acesso a email. Alguns provedores verificam automaticamente esses endereços de e-mail.
phone_number O número de telefone associado à conta, se essa informação existir.
name O nome de exibição do usuário, se ele tiver sido definido.
sub O UID do Firebase do usuário. Ele é exclusivo dentro de um projeto.
firebase.identities O dicionário de todas as identidades associadas à conta desse usuário. As chaves do dicionário podem ser uma destas: email, phone, google.com, facebook.com, github.com ou twitter.com. Os valores do dicionário são matrizes de identificadores exclusivos de cada provedor de identidade associado à conta. Por exemplo, auth.token.firebase.identities["google.com"][0] contém o primeiro código de usuário do Google associado à conta.
firebase.sign_in_provider O provedor de entrada usado para receber esse token. Ele pode ser uma destas strings: custom, password, phone, anonymous, google.com, facebook.com, github.com ou twitter.com.

Se você quer adicionar atributos de autenticação personalizados, saiba que a variável auth.token também contém as declarações personalizadas especificadas por você.

Quando o usuário que está solicitando acesso não estiver conectado, a variável auth será null. Será possível utilizar essa configuração nas regras se, por exemplo, você quiser limitar o acesso de leitura a usuários autenticados: auth != null. No entanto, geralmente recomendamos restringir ainda mais o acesso de gravação.

Para mais informações sobre a variável auth, consulte a documentação de referência do Cloud Firestore, Realtime Database e Storage.

Utilizar as informações do usuário nas regras

Na prática, o uso de informações autenticadas nas regras torna-as mais eficientes e flexíveis. É possível controlar o acesso aos dados com base na identidade do usuário.

Nas suas regras, defina como as informações da variável auth (os dados de usuário do solicitante) correspondem às informações do usuário associadas aos dados solicitados.

Por exemplo, pode ser que seu aplicativo queira garantir que os usuários só tenham permissão para ler e gravar os próprios dados deles. Nesse caso, você precisaria de uma correspondência entre a variável auth.uid e o código 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, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}

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"
      }
    }
  }
}

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.uid == userId;
  }
}

Definir informações personalizadas do usuário

É possível tirar ainda mais proveito da variável auth para definir campos personalizados atribuídos aos usuários do seu aplicativo.

Por exemplo, suponha que você queira criar um papel de administrador que permita o acesso de gravação em determinados caminhos. Você designaria esse atributo aos usuários e, em seguida, utilizaria as regras que concedem acesso aos caminhos.

No Cloud Firestore, é possível adicionar um campo personalizado aos documentos dos usuários e recuperar o valor desse campo com uma leitura incorporada às regras. Dessa forma, sua regra com base no administrador será semelhante ao exemplo a seguir:

Cloud Firestore

service cloud.firestore {
  match "some_collection/": {
    // Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
    write: if get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin) == true;
    read: if request.auth.uid != null;
  }
}

Para as regras no Realtime Database e Storage, crie declarações personalizadas no Authentication. É possível fazer referência a essas declarações usando a variável auth.token.

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"
      }
    }
  }

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 mais exemplos de regras básicas que utilizam o Authentication, consulte Regras básicas de segurança.