Permissão negada do Firebase usando curl e javascript
-
21-12-2019 - |
Pergunta
Eu tenho um Firebase com uma configuração de segurança como esta:
{
"rules": {
"serviceproviders": {
".read": "auth != null",
".write": "auth != null"
},
"bookings": {
".read": "auth != null",
".write": true,
".validate": "newData.hasChildren(['phone', 'time', 'date', 'apikey'])",
"apikey": {
// only allow valid apikey
".validate": "root.child('serviceproviders/' + newData.val()).exists()"
}
},
"status": {
".read": "auth != null",
".write": true
}
}
}
A ideia é que os usuários só possam postar /bookings/
com um válido apikey
, isto é, um apikey
que pode ser encontrado em /serviceproviders/
.
No simulador do Firebase, isso funciona conforme o esperado.Porém, quando eu uso curl
do terminal ou Javascript de uma página html, recebo error: permission denied
de volta do Firebase.Envio exatamente os mesmos dados (copiar e colar).
Meu curl
comando fica assim:
$ curl -X POST -d '{"phone":"004512345678", "date":"2014-07-31","time":"10:00","apikey":"AA227D80-122C-4E5D-AEDF-24A829FA6403"}' https://example.firebaseIO.com/bookings/.json
E eu volto:
{
"error" : "Permission denied"
}
Solução
OK, depois de muitas horas puxando meu cabelo, percebi que no guia do Firebase.com, o ".validate"
as regras estão dentro de um bloco que indica o ID nesse caminho, assim:
{
"rules": {
"serviceproviders": {
".read": "auth != null",
".write": "auth != null"
},
"bookings": {
".read": "auth != null",
".write": true,
"$bookings_id": {
"apikey": {
// only allow valid apikey
".validate": "root.child('serviceproviders/' + newData.val()).exists()"
},
".validate": "newData.hasChildren(['apikey','date','time','phone'])"
}
},
"status": {
".read": "auth != null",
".write": true
}
}
}
funciona como esperado, devido ao "$bookings_id"
bloquear.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow