Permiso denegado de Firebase usando curl y javascript
-
21-12-2019 - |
Pregunta
Tengo un Firebase con una configuración de seguridad 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
}
}
}
La idea es que los usuarios sólo puedan publicar /bookings/
con un valido apikey
, es decir, un apikey
que se puede encontrar en /serviceproviders/
.
En el simulador de Firebase, esto funciona como se esperaba.Sin embargo, cuando uso curl
desde la terminal, o Javascript desde una página html, obtengo error: permission denied
de regreso de Firebase.Envío exactamente los mismos datos (copiar y pegar).
Mi curl
El comando se ve así:
$ 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
Y vuelvo:
{
"error" : "Permission denied"
}
Solución
Bien, después de muchas horas de tirarme del pelo, me di cuenta de que en la guía de Firebase.com, el ".validate"
Las reglas están dentro de un bloque que indica el ID bajo esa ruta, por lo tanto:
{
"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 se esperaba, debido a la "$bookings_id"
bloquear.