Autorisation refusée depuis Firebase à l'aide de curl et javascript
-
21-12-2019 - |
Question
J'ai un Firebase avec une configuration de sécurité comme celle-ci :
{
"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'idée est que les utilisateurs ne peuvent publier que /bookings/
avec un valide apikey
, c'est-à-dire un apikey
que l'on peut trouver dans /serviceproviders/
.
Dans le simulateur Firebase, cela fonctionne comme prévu.Cependant, lorsque j'utilise curl
depuis le terminal, ou Javascript depuis une page html, j'obtiens error: permission denied
de retour de Firebase.J'envoie exactement les mêmes données (copier-coller).
Mon curl
la commande ressemble à ceci :
$ 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
Et je reviens :
{
"error" : "Permission denied"
}
La solution
OK, donc après plusieurs heures passées à me tirer les cheveux, j'ai réalisé que dans le guide sur Firebase.com, le ".validate"
les règles se trouvent à l'intérieur d'un bloc indiquant l'ID sous ce chemin, ainsi :
{
"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
}
}
}
fonctionne comme prévu, en raison du "$bookings_id"
bloc.