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"
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top