Разрешение отклонено из Firebase с использованием Curl и JavaScript
-
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"
блокировать.