Разрешение отклонено из Firebase с использованием Curl и JavaScript

StackOverflow https://stackoverflow.com//questions/25034706

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть Firebase с такой конфигурацией безопасности:

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

Идея состоит в том, что пользователи могут публиковать только /bookings/ с действительным apikey, то есть apikey который можно найти в /serviceproviders/.

В симуляторе Firebase это работает так, как ожидалось.Однако, когда я использую curl из терминала или Javascript со страницы html, я получаю error: permission denied вернулся из Firebase.Я отправляю точно такие же данные (копировать и вставить).

Мой curl команда выглядит так:

$ 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

И я возвращаюсь:

{
  "error" : "Permission denied"
}
Это было полезно?

Решение

Итак, после многих часов работы над собой я понял, что в руководстве на Firebase.com ".validate" правила находятся внутри блока, обозначающего идентификатор по этому пути, таким образом:

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

работает так, как ожидалось, из-за "$bookings_id" блокировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top