Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

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 papéis que mantenham os dados de seus usuários seguros, use o Firebase Authentication com 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 houver.
email_verified true se o usuário tiver verificado que tem acesso ao endereço de email -mail. Alguns provedores verificam automaticamente os endereços de e-mail que possuem.
phone_number O número de telefone associado à conta, se houver.
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 entrada 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 do 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 torna suas regras 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ê queira 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 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 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 utilizam a autenticação, consulte Regras básicas de segurança .