Autorizzazione negato da Firebase utilizzando Curl e JavaScript
-
21-12-2019 - |
Domanda
Ho una tazza di fuoco con una configurazione di sicurezza come questa:
{
"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
}
}
}
.
L'idea è che gli utenti possono postare solo /bookings/
con un apikey
valido, ovvero un apikey
che può essere trovato in /serviceproviders/
.
Nel simulatore di Firebase, funziona come previsto.Tuttavia, quando utilizzo curl
dal terminale o JavaScript da una pagina HTML, ottengo error: permission denied
da Firebase.Invio esattamente gli stessi dati (copia e incolla).
Il mio comando curl
è simile a questo:
$ 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 torno indietro:
{
"error" : "Permission denied"
}
. Soluzione
Ok, quindi dopo molte ore di tirando i capelli, mi resi conto che nella guida su FireBase.com, le regole ".validate"
sono all'interno di un blocco che denota l'ID sotto quel percorso, quindi:
{
"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
}
}
}
.
funziona come previsto, a causa del blocco "$bookings_id"
.