Regras de segurança e autenticação do Firebase

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 .