Berechtigung von Firebase mit Curl und Javascript verweigert
-
21-12-2019 - |
Frage
Ich habe eine Firebase mit einer Sicherheitskonfiguration wie dieser:
{
"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
}
}
}
Die Idee ist, dass Benutzer nur posten können /bookings/
mit einem gültigen apikey
, das heißt, ein apikey
das findet man in /serviceproviders/
.
Im Firebase-Simulator funktioniert dies wie erwartet.Allerdings, wenn ich benutze curl
Vom Terminal oder Javascript von einer HTML-Seite erhalte ich error: permission denied
zurück von Firebase.Ich sende genau die gleichen Daten (Kopieren & Einfügen).
Mein curl
Der Befehl sieht so aus:
$ 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
Und ich komme zurück:
{
"error" : "Permission denied"
}
Lösung
OK, nachdem ich viele Stunden lang an meinen Haaren gezogen hatte, wurde mir klar, dass in der Anleitung auf Firebase.com das ".validate"
Regeln befinden sich in einem Block, der die ID unter diesem Pfad angibt, also:
{
"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
}
}
}
Funktioniert wie erwartet, da "$bookings_id"
Block.