O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Gerenciar e implantar regras de segurança do Firebase

Usar a Firebase CLI

Edite e implemente regras usando a Firebase CLI. Assim, é possível manter as regras sob controle de versão com o código do aplicativo e implementar regras como parte do processo de implantação atual.

Gerar um arquivo de configuração

Ao configurar o projeto do Firebase usando a Firebase CLI, você cria um arquivo de configuração .rules no diretório do projeto. Use o seguinte comando para começar a configurar o projeto do Firebase:

Cloud Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

Realtime Database

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Storage

// Set up Storage in your project directory, creates a .rules file
firebase init storage

Editar e atualizar as regras

Edite suas regras diretamente no arquivo de configuração .rules. Certifique-se de que todas as edições feitas na Firebase CLI sejam refletidas no Console do Firebase ou que você faça atualizações constantemente usando o Console do Firebase ou a Firebase CLI. Caso contrário, você poderá substituir as atualizações feitas no Console do Firebase.

Testar as atualizações

Use o emulador do Firebase para testar as atualizações localmente e verificar se as regras do aplicativo exibem o comportamento desejado.

Implantar as atualizações

Depois de atualizar e testar suas regras, implante-as em produção. Use os seguintes comandos para implantá-las seletivamente ou como parte do processo normal de implantação.

Cloud Firestore

// Deploy your .rules file
firebase deploy --only firestore:rules

Realtime Database

// Deploy your .rules file
firebase deploy --only database

Storage

// Deploy your .rules file
firebase deploy --only storage

Usar o Console do Firebase

É possível também editar e implantar regras no Console do Firebase.

Editar e atualizar as regras

  1. Abra o Console do Firebase e selecione seu projeto.
  2. Em seguida, selecione Realtime Database, Cloud Firestore ou Storage na navegação do produto e clique em Regras para acessar o Editor de regras.
  3. Ajuste suas regras diretamente no editor.

Testar as atualizações

É possível testar o comportamento das suas regras diretamente no Console do Firebase por meio do simulador de regras. Abra a tela do Simulador no editor de regras, modifique as configurações e clique em Executar. Procure a mensagem de confirmação na parte superior do editor.

Implantar as atualizações

Quando você achar que as atualizações foram implementadas conforme o esperado, clique em Publicar.

Usar o SDK Admin

É possível usar o SDK Admin para Node.js para criar, gerenciar e implantar regras de segurança de maneira programática. Com esse acesso programático, é possível:

  • Implementar ferramentas, scripts, painéis e pipelines de CI/CD personalizados para gerenciar regras.
  • Gerenciar regras com mais facilidade em vários projetos do Firebase.

Ao atualizar regras de maneira programática, é muito importante evitar alterações indesejadas no controle de acesso do seu aplicativo. Escreva seu código do SDK Admin tendo em mente a segurança, principalmente ao atualizar ou implantar regras.

Outra coisa importante a ser lembrada é que as regras de segurança do Firebase levam alguns minutos para serem implantadas por completo. Ao usar o SDK Admin para implantar regras, evite disputas em que o aplicativo dependa imediatamente de regras cuja implantação ainda não foi concluída. Se o caso de uso exigir atualizações frequentes para regras de controle de acesso, considere soluções que usam o Cloud Firestore, que foi projetado para reduzir disputas, apesar das atualizações frequentes.

Observe também estes limites:

  • As regras precisam ser menores que 64 KiB de texto codificado em UTF-8 quando serializadas.
  • Um projeto pode ter no máximo 2.500 conjuntos de regras implantados. Quando esse limite for atingido, você precisará excluir alguns conjuntos de regras antigos antes de criar novos.

Criar e implantar conjuntos de regras do Storage ou do Cloud Firestore

Um fluxo de trabalho típico para gerenciar regras de segurança com o SDK Admin pode incluir três etapas distintas:

  1. Criar um arquivo de regras (opcional)
  2. Criar um conjunto de regras
  3. Libere ou implante o novo conjunto de regras

O SDK fornece um método para combinar essas etapas em uma única chamada de API para regras de segurança do Storage e do Cloud Firestore. Exemplo:

    const source = `service cloud.firestore {
      match /databases/{database}/documents {
        match /carts/{cartID} {
          allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
          allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
        }
      }
    }`;
    // Alternatively, load rules from a file
    // const fs = require('fs');
    // const source = fs.readFileSync('path/to/firestore.rules', 'utf8');

    await admin.securityRules().releaseFirestoreRulesetFromSource(source);

Esse mesmo padrão funciona para regras do Storage com releaseFirestoreRulesetFromSource().

Como alternativa, é possível criar o arquivo de regras como um objeto na memória, criar o conjunto de regras e implantá-lo separadamente para ter um controle mais próximo desses eventos. Exemplo:

    const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
    const rs = await admin.securityRules().createRuleset(rf);
    await admin.securityRules().releaseFirestoreRuleset(rs);

Atualizar conjuntos de regras do Realtime Database

Para atualizar os conjuntos de regras do Realtime Database com o SDK Admin, use os métodos getRules() e setRules() de admin.database. É possível recuperar conjuntos de regras no formato JSON ou como uma string com comentários incluídos.

Para atualizar um conjunto de regras:

    const source = `{
      "rules": {
        "scores": {
          ".indexOn": "score"
            "$uid": {
            ".read": "$uid == auth.uid",
            ".write": "$uid == auth.uid"
          }
        }
      }
    }`;
    await admin.database().setRules(source);

Gerenciar conjuntos de regras

Para ajudar a gerenciar grandes conjuntos de regras, o SDK Admin permite listar todas as regras existentes com admin.securityRules().listRulesetMetadata. Exemplo:

    const allRulesets = [];
    let pageToken = null;
    while (true) {
      const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
      allRulesets.push(...result.rulesets);
      pageToken = result.nextPageToken;
      if (!pageToken) {
        break;
      }
    }

Para conjuntos de regras muito grandes que atingem o limite de 2.500 regras ao longo do tempo, é possível criar uma lógica para excluir as regras mais antigas em um ciclo de tempo fixo. Por exemplo, para excluir TODOS os grupos de regras implantados por mais de 30 dias:

    const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
    const promises = [];
    allRulesets.forEach((rs) => {
      if (new Date(rs.crateTime) < thirtyDays) {
        promises.push(admin.securityRules().deleteRuleset(rs.name));
      }
    });
    await Promise.all(promises);
    console.log(`Deleted ${promises.length} rulesets.`);