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 ID 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 ao endereço 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 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 de 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 entrada usado para receber esse token. Pode ser uma das seguintes strings: custom, password, phone, anonymous, google.com, facebook.com, github.com ou twitter.com.
firebase.tenant O ID do locatário associado à conta, se houver. Por exemplo, tenant2-m6tyz.

Se você quiser adicionar atributos de autenticação personalizados, a variável auth.token também vai conter todas as declarações personalizadas que você especificar.

Quando o usuário que está solicitando acesso não está conectado, a variável auth é null. É possível aproveitar isso nas suas 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 Cloud 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 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, 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 cenário, você quer 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, 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;
  }
}

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 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 /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 nas regras depois de criar declarações personalizadas no Authentication. É possível se referir 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";
   }
  }
}

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