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.
---




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?
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
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!
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 👊😅
Essa parte de regras de segurança no Firebase realmente pode ser traiçoeira, e você explicou com uma clareza incrível.