Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Como estruturar e manter seguro meus dados no F...

Avatar for Ana Coimbra Ana Coimbra
November 24, 2018

Como estruturar e manter seguro meus dados no Firebase?

Avatar for Ana Coimbra

Ana Coimbra

November 24, 2018
Tweet

More Decks by Ana Coimbra

Other Decks in Technology

Transcript

  1. 3

  2. “ "Já usei firebase uma vez, mas tive que mudar

    para o [insira qualquer banco de dados não relacional aqui] porque ..." 4
  3. Não era pra me ajudar? O Firebase possui ótimas ferramentas

    para desenvolvimento de produtos digitais, mas é necessário planejamento e estruturação. 8
  4. Banco de dados SQL 9 Usuários id nome email 1

    "Ada Lovelace" "[email protected]" 2 "Alan Turing" "[email protected]" Transações id valor data tipo usr_fr_key 1 50.00 20-11-2018 "despesa" 2 2 10.00 23-11-2018 "receita" 1
  5. Banco de dados SQL 10 Usuários id nome email 1

    "Ada Lovelace" "[email protected]" 2 "Alan Turing" "[email protected]" Transações id valor data tipo usr_fr_key 1 50.00 20-11-2018 "despesa" 2 2 10.00 23-11-2018 "receita" 1 3 5 24-11-2018 1 1
  6. Banco de dados SQL 11 Usuários id nome email 1

    "Ada Lovelace" "[email protected]" 2 "Alan Turing" "[email protected]" Transações id valor data tipo usr_fr_key 1 50.00 20-11-2018 "despesa" 2 2 10.00 23-11-2018 "receita" 1 Select * FROM Usuários, Transações WHERE User.id = 1 AND Transações.usr_fr_key = User.id
  7. Banco de dados NoSQL id: 1 valor: 50.00 data: 20-11-2018

    tipo: "despesa" id_usuário: 1 id: 2 valor: 10.00 data: 23-11-2018 tipo: "receita" id_usuário: 1 12
  8. Banco de dados NoSQL id: 1 valor: 50.00 data: 20-11-2018

    tipo: "despesa" id_usuário: 1 observações: "Tive que pagar o táxi." id: 2 valor: 10.00 data: 23-11-2018 tipo: "receita" id_usuário: 1 13
  9. Banco de dados NoSQL id: 1 valor: 50.00 data: 20-11-2018

    tipo: "despesa" id_usuário: 1 id: 2 valor: 10.00 data: 23-11-2018 tipo: "receita" id_usuário: 2 14 transações_do_dia_20 = collection('Transacao').where('data', '==', 20-11-2018).get() Para cada transacoes_do_dia_20: collection.('Usuarios').doc(transacao.id_usuário).get()
  10. Banco de dados NoSQL id: 1 valor: 50.00 data: 20-11-2018

    tipo: "despesa" usuário: { nome: "Ada Lovelace" } id: 2 valor: 10.00 data: 23-11-2018 tipo: "receita" usuário: { nome: "Alan Turing" } 15 Ainda existe na raiz, os dados completos de Usuários
  11. Banco de Dados NoSQL ◂ Manter consistência ◂ Número de

    leituras é muito maior que o número de atualizações nos dados ◂ É fácil distribuir os dados entre servidores diferentes. ◂ Duplicar apenas dados estritamente necessários para a leitura. 16
  12. Firestore (NoSQL) ◂ Altamente distribuído ◂ Queries de filtro e

    ordenação (limitações) ◂ Sincronização em tempo real ◂ Não possui backup nativo ◂ Beta 18
  13. Modelo de dados ◂ Os dados são documentos organizados dentro

    de coleções ◂ Otimizado para guardar uma grande quantidade de pequenos documentos 19
  14. Documentos ◂ Um registro simples que possuem chaves que apontam

    para um valor ◂ Todo documento possui um identificador único ◂ Pode ter uma sub coleção ◂ Pode ter no máximo 1MB ▪ 1 ◂ nome: "Ada Lovelace" ◂ email: "[email protected]" 20
  15. Coleções ◂ Container para os documentos ◂ Contém apenas documentos

    ◂ Os identificadores dos documentos devem ser únicos dentro da coleção ☰ Users ▪ 1 ◂ nome: "Ada Lovelace" ◂ email: "[email protected]" ▪ 2 ◂ nome: "Alan Turing" ◂ email: "[email protected]" 21
  16. Referências ◂ Ponteiros para uma localização no banco de dados

    ◂ Todos os documentos podem ser acessados com seus identificadores através de referências. ◂ É possível referenciar também coleções 22 collections/Usuários/1/Transações/1
  17. Estruturação dos dados Existem 3 formas padrões de estruturar os

    dados: Dados aninhados em documentos, subcoleções e coleções na raiz
  18. Dados em documentos Usuários: [ 1: { nome: "Ada Lovalace",

    email: "[email protected]", Transações: [ 1: { valor: 50.00, data: 20-11-2018, tipo: "despesa" } ] } ] 24
  19. Dados em documentos Usuários: [ 1: { nome: "Ada Lovalace",

    email: "[email protected]", Transações: [ 1: { valor: 50.00, data: 20-11-2018, tipo: "despesa" } ] } ] 25 ◂ Máx 1MB ◂ Máx 1 escrita/ doc / segundo ◂ Não suporta queries ◂ Pouco escalável ◂ Retorna muitos dados e as vezes não são necessários
  20. Sub coleções ☰ Users ▪ 1 ◂ nome: "Ada Lovelace"

    ◂ email: "[email protected]" ☰ Transações ▪ 1 ◂ valor: 50.00 ◂ data: 20-11-2018 ◂ tipo: "despesa" 26
  21. Sub coleções ☰ Users ▪ 1 ◂ nome: "Ada Lovelace"

    ◂ email: "[email protected]" ☰ Transações ▪ 1 ◂ valor: 50.00 ◂ data: 20-11-2018 ◂ tipo: "despesa" 27 ◂ Consegue otimizar queries dentro da sub coleção ◂ Mais escalável ◂ Não é tão simples deletar sub coleções ◂ Não é possível fazer queries entre coleções diferentes
  22. Coleções na raiz ☰ Users ▪ 1 ◂ nome: "Ada

    Lovelace" ◂ email: "[email protected]" ☰ Transações ▪ 1 ◂ valor: 50.00 ◂ data: 20-11-2018 ◂ tipo: "despesa" ◂ usuário: 1 28
  23. Coleções na raiz ☰ Users ▪ 1 ◂ nome: "Ada

    Lovelace" ◂ email: "[email protected]" ☰ Transações ▪ 1 ◂ valor: 50.00 ◂ data: 20-11-2018 ◂ tipo: "despesa" ◂ usuário: 1 29 ◂ Altamente escalável ◂ Possibilidade de fazer buscas mais elaboradas dentro das coleções ◂ Complexidade para trabalhar com dados hierárquicos
  24. Já está na hora de surtar? Está na hora de

    respirar e avaliar como será o projeto 30
  25. Sugestão de estrutura ☰ Users ▪ 1 ◂ nome: "Ada

    Lovelace" ◂ email: "[email protected]" ☰ Transações ▪ 1 ◂ valor: 50.00 ◂ data: 20-11-2018 ◂ tipo: "despesa" ☰ Transações ▪ 1 ◂ valor: 50.00 ◂ data: 20-11-2018 ◂ tipo: "despesa" ◂ usuário: { nome: "Ada Lovelace" } 31
  26. 33

  27. 34

  28. 35

  29. 36

  30. 37

  31. Firebase Cloud Functions ◂ Possibilidade de executar códigos de back

    end de forma fácil e rápida ◂ Triggers de eventos de outras funcionalidades do Firebase (autenticação, banco de dados, armazenamento, etc) ◂ Chamadas Http 39
  32. 40 exports const copyTransaction = functions.firestore .document('transactions/{id}').onWrite((change, context) => {

    // ... Copiar/Atualizar transação na sub coleção do usuário. }); Firebase Cloud Functions Mantém consistência exports const updateUserOnTransaction = functions.firestore .document('user/{id}').onUpdate((change, context) => { // ... Atualizar user.name nas transações desse usuário. (Usar batches) });
  33. Mas e a segurança? Não queremos que outra pessoa tenha

    acesso as minhas transações, certo? 41
  34. Segurança de dados Controle de Acesso e Identidade (IAM) Controla

    quem pode acessar quais informações de qual recurso Regras de Segurança Documento que define as regras de acesso do lado do cliente, independente de servidor 42
  35. 43

  36. Regras de segurança ◂ Nenhum usuário deve pode ler ou

    atualizar alguma transação que não tenha sido criada por ele mesmo, dentro da sua própria coleção. ◂ Ao criar uma transação, nenhuma data deve ser maior que a data de criação. ◂ Apenas administradores podem ler as transações na raiz. ◂ Nenhum usuário pode criar ou atualizar transações na raiz. 44
  37. 45 service cloud.firestore { match /databases/{database}/documents { match /users/{userId} {

    allow read: if isAuthenticated(); allow write: if isUser(userId); match /transactions/{transactionId} { allow create, update: if isAuthenticated() && incomingData().date is timestamp && incomingData().date <= request.time.date(); allow read, delete: if isUser(userId); } } match /transactions/{transactionId} { allow read: if isAdmin(); } } }
  38. 46 function isAuthenticated() { return request.auth != null; } function

    isUser(userId) { return request.auth.uid == userId; } function existingData() { return resource.data; } function incomingData() { return request.resource.data; } function getUser() { return get(/databases/$(database)/documents/users/$(request.auth.uid)); } function isAdmin() { return getUser().data.admin == true; }
  39. Limitações ◂ Máx 10 chamadas single-doc ◂ Máx 20 chamadas

    multi-doc (batch) ◂ Profundidade máxima de chamadas de função: 20 ◂ Não permite chamadas recursivas ◂ Número máximo de expressões: 10.000 ◂ Tamanho máximo: 46KB 47
  40. Isso tudo parece bem caro ... O Firebase oferece utilizações

    gratuita e planos de pagamento sob demanda. 48
  41. Definir limites É possível definir um limite diário de gastos.

    ◂ Após atingir o limite, os acessos param de funcionar Atribuir um orçamento mensal para os gastos com Google Cloud ◂ É possível configurar alertas para saber quando seu gasto está no limite do orçamento 49
  42. Formas de cobrança 50 1. Número de leituras, escritas e

    exclusões 2. Tamanho dos dados armazenados 3. Largura de banda utilizada Será cobrado pelo menos 1 leitura, mesmo que a chamada não retorne nenhum documento
  43. Formas de Cobrança - Escritas e Leituras Leituras em tempo

    real Cobrado unitariamente para cada documento que é alterado Queries Cobrado uma leitura para cada documento recuperado Soluções: Cursores, paginação, limites e offsets Functions e Regras de segurança Cada chamada no functions é contada assim como get() e exists() no documento de regras Solução: muitas chamadas são cacheadas 51
  44. Formas de Cobrança - Tamanho dos dados ◂ Inclui a

    quantidade dos dados, junto com seus meta dados e índices compostos e automáticos 52
  45. Forma de Cobrança - Largura de Banda ◂ Depende de:

    ◂ Tamanho da resposta ◂ Localização do banco de dados ◂ Destino da resposta 53
  46. 55 Links ◂ Documentação oficial: https://firebase.google.com/docs/firestore/ ◂ Vídeos sobre Firestore:

    https://www.youtube.com/playlist?list=PLl-K7zZEsYLluG5MC VEzXAQ7ACZBCuZgZ ◂ Plug-in para Visual Studio Code: https://marketplace.visualstudio.com/items?itemName=tob a.vsfire