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"
}
.

È stato utile?

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".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top