Ir para o console

Proteger dados do usuário

As regras de segurança do Firebase para Cloud Storage estão integradas com o Firebase Authentication para fornecer ao Storage uma autenticação eficiente baseada em usuários. Isso permite o controle de acesso granular com base em reivindicações de um token do Authentication.

Autenticação do usuário

Quando um usuário autenticado faz uma solicitação para o Cloud Storage, a variável request.auth é preenchida com o uid do usuário (request.auth.uid) e com as reivindicações JWT do Firebase Authentication(request.auth.token).

Além disso, quando você usa a autenticação personalizada, outras reivindicações são expostas no campo request.auth.token.

Quando um usuário não autenticado faz uma solicitação, a variável request.auth é null.

Com esses dados, há várias maneiras comuns de usar a autenticação para proteger os arquivos:

  • Público: ignora o request.auth
  • Privado autenticado: verifica se o request.auth não é null
  • Privado por usuário: verifica se o request.auth.uid é igual ao uid do caminho
  • Privado por grupo: verifica as reivindicações do token personalizado para confirmar se elas correspondem a uma reivindicação escolhida ou lê os metadados do arquivo para ver se existe um campo de metadados

Público

Qualquer regra que não considere o contexto do request.auth pode ser considerada uma regra public, uma vez que ele não é considerado na autenticação do usuário. Essas regras podem ser úteis para expor dados públicos, como recursos do jogo, arquivos de som ou outros conteúdos estáticos.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

Privado autenticado

Em determinados casos, os dados devem ser visíveis somente para os usuários autenticados do seu aplicativo. Uma vez que a variável request.auth é null para todos os usuários não autenticados, só é necessário verificar se a variável request.auth existe para solicitar a autenticação:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

Privado por usuário

O caso de uso mais comum de request.auth é fornecer permissões granulares aos seus arquivos para usuários individuais. Isso inclui desde fazer o upload de imagens do perfil até ler documentos particulares.

Como os arquivos no Cloud Storage têm um caminho completo, tudo o que é necessário para controlá-lo por usuário é ter uma parte das informações exclusivas de identificação do usuário no caminho do arquivo, por exemplo, o uid do usuário. Essa identificação é verificada quando a regra é avaliada:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

Privado por grupo

Outro caso de uso igualmente comum é conceder permissões de acesso a um objeto para um grupo. Por exemplo, permitir que vários membros da equipe colaborem em um documento compartilhado. Há várias abordagens para fazer isso, como:

  • produzir um token personalizado do Firebase Authentication que contenha informações adicionais sobre um membro do grupo (por exemplo, um código do grupo);
  • incluir informações do grupo (por exemplo, um código de grupo ou uma lista de uids autorizados) nos metadados do arquivo.

Depois que esses dados são armazenados no token ou nos metadados do arquivo, elem podem ser referenciados dentro de uma regra:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

Exemplo completo

Veja no exemplo abaixo casos simples dos quatro tipos comuns de restrições de autenticação:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Anyone can view any image (no auth, publicly readable)
      match /{allImages=**} {
        allow read;
      }

      // Only authenticated users can write to "public" images
      match /public/{imageId} {
        allow write: if request.auth != null;
      }

      // Only an individual user can write to "their" images
      match /{userId}/{imageId} {
        allow write: if request.auth.uid == userId;
      }

      // Allow a "group" of users to read/write to shared images
      // An owner metadata property on the object contains the groupId for reads
      // A custom token has been minted with a groupId property for writes
      match /{groupId}/{imageId} {
        allow read: if resource.metadata.owner == request.auth.token.groupId;
        allow write: if request.auth.token.groupId == groupId;
      }
    }
  }
}