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"
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top