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

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
scroll top