image

Bootcamps ilimitados + curso de inglés para sempre

80
%OFF
Antonio Guedes
Antonio Guedes21/04/2025 19:18
Compartir

Firebase Realtime Database: Como Regras de Segurança (quase) travaram meu projeto de Jogo da Velha

    Você já teve aquela sensação de que o código está certo, mas simplesmente não funciona? Foi o que vivi no desenvolvimento de um projeto pessoal usando o Firebase Realtime Database. O jogo da velha multiplayer estava no ar, mas a partida nunca começava. 😵‍💫

    A causa? Regras de segurança mal compreendidas.

    Neste artigo compartilho o erro, a descoberta, a solução e um lembrete: “Não é sobre o jogo. É sobre quebrar padrões.

    🔍 O problema

    Ao testar o projeto, percebi que os jogadores se conectavam, mas a partida não iniciava. Após diversas revisões no código, identifiquei que o Firebase estava negando a alteração da chave isFull, impedindo que o jogo começasse.

    O motivo era claro (depois que eu entendi): as regras de segurança estavam mal configuradas e esperavam uma estrutura de dados que nem existia no meu banco.

    🛠️ A estrutura esperada no banco de dados

    O Firebase aguardava que os dados dos jogadores estivessem registrados em uma estrutura chamada userGames, mas essa parte nunca foi implementada. Por isso, as permissões eram negadas.

    A estrutura real do banco no projeto era assim:

    games
     └── game
        └── $matchId
             ├── players
             │    ├── player1
             │    └── player2
             ├── isFull
             ├── currentPlayer
             ├── eventos
             └── moves
    

    🔐 A Regra de Segurança que me travou

    As regras originais tentavam validar algo assim:

    "players": {
    "player1": {
      ".write": "root.child('userGames/' + auth.uid + '/' + $matchId + '/playerId').val() === data.child('id').val() || !data.exists()"
    },
    "player2": {
      ".write": "root.child('userGames/' + auth.uid + '/' + $matchId + '/playerId').val() === data.child('id').val() || !data.exists()"
    }
    }
    

    Ou seja, a permissão era baseada em uma verificação que sempre falhava, pois userGames não existia.

    ✅ A correção que funcionou

    Depois de estudar a documentação oficial do Firebase, reestruturei as regras com base na presença dos jogadores dentro da própria estrutura do jogo:

    "players": {
    "player1": {
      ".write": "!data.exists()"
    },
    "player2": {
      ".write": "!data.exists() && root.child('games/game' + $matchId + '/players/player1').exists()"
    }
    },
    "isFull": {
    ".read": "auth != null",
    ".write": "!data.exists() || (root.child('games/game' + $matchId + '/players/player1').exists() && root.child('games/game' + $matchId + '/players/player2').exists())"
    }
    

    Agora sim! O jogo reconhece a presença dos dois jogadores e altera a chave isFull para true, permitindo o início da partida. 🎮

    📚 O que aprendi com isso?

    • Não subestime a documentação.
    • Regras de segurança são parte essencial do backend.
    • Estude a ferramenta antes de usá-la.
    • E o mais importante: “Imperfeito feito vence, perfeito nunca feito.”

    Esse projeto é parte de uma série que estou escrevendo para documentar como estou quebrando padrões de procrastinação e evoluindo como dev.

    Se você também está enfrentando desafios nos seus projetos, saiba que você não está sozinho.

    ---

    📌 Repositório no GitHub

    🧠 Documentação de Regras do Firebase

    ✍️ Leia os posts anteriores da série no blog

    Compartir
    Recomendado para ti
    Microsoft 50 Anos - Prompts Inteligentes
    Microsoft 50 Anos - GitHub Copilot
    Microsoft 50 Anos - Computação em Nuvem com Azure
    Comentarios (5)
    DIO Community
    DIO Community - 23/04/2025 12:00

    Parabéns, Antonio! A sua experiência com o Firebase Realtime Database é um ótimo exemplo de como pequenos detalhes podem travar um projeto inteiro. Adorei como você compartilhou não apenas a dificuldade, mas também a solução de forma clara e prática. Seu lembrete sobre a importância de estudar a documentação é algo que todos nós, como desenvolvedores, precisamos ter sempre em mente.

    O que você aprendeu é um ótimo conselho para quem está começando: entender as ferramentas e suas configurações é essencial para evitar frustrações. Além disso, é incrível ver você compartilhando a jornada e os desafios que superou no seu caminho de desenvolvimento. Qual foi o maior aprendizado que você tirou dessa experiência ao enfrentar o problema das regras de segurança?

    Antonio Guedes
    Antonio Guedes - 23/04/2025 09:05

    Olá @Arthur,


    bom dia meu grande!

    Que bom que você gostou. Mano, eu penei até achar a documentação que explica com mais clareza, o chatGPT não indicava a página correta, o Copilot também não, somente o Gemini me deu uma lista de endereços e aí encontrei a referência da linguagem para as regras de segurança do firebase. Aí comecei a corrigir.

    Ainda tem outros erros, mas estou postando essa odiceia no blog a respeito dessa jornada do iniciante tentando fazer um projeto do início ao fim sem desistir. Se puder dar uma moral lá fico grato!


    https://guedesindev.github.io

    Antonio Guedes
    Antonio Guedes - 23/04/2025 09:02

    Olá @William Silva!

    Verdade meu caro! Como os especialistas dizem: "Não tenham medo dos erros, se puder goste deles"

    Acho que inclusive é uma parte muito pouco ensinada nos cursos de programação, seja ele qual for! A turma fala de Tratamento de Erros, mas não fala a respeito de ENTENDER os erros, pois o próprio erro já diz ONDE precisa ser mexido e QUAL o erro que precisa ser tratado.


    Obrigado por teu comentário!

    William Silva
    William Silva - 22/04/2025 07:11

    Pior de tudo isso meu brother! É que por medo de falhar muitos de nós sequer tentamos e nós na verdade temos que ser especialistas em falhas, só errando de diferentes formas seremos bons resolvedores de problemas hehe 👊😅

    Arthur Carneiro
    Arthur Carneiro - 22/04/2025 08:13

     Essa parte de regras de segurança no Firebase realmente pode ser traiçoeira, e você explicou com uma clareza incrível.