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"
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top