#reactjs #firebase #rest #firebase-realtime-database #firebase-security
#reactjs #firebase #отдых #firebase-realtime-database #firebase-безопасность
Вопрос:
Это мой первый вопрос, поэтому, если я что-то пропустил, пожалуйста, скажите мне, и большое спасибо, что прочитали его.
У меня есть база данных в реальном времени с такой структурой:
-transactions
-uid
-transaction1...
При добавлении новой транзакции с этими правилами:
{
"rules": {
"transactions": {
"$uid":{
".read": "auth != null amp;amp; auth.uid == $uid",
".write": "auth != null amp;amp; auth.uid == $uid",
}
}
}
}
И этот URL: (я использую REST API)
POST https://{{appName}}.firebaseio.com/transactions/{{userId}}.json?auth={{TOKEN}}
С этими данными:
{
"title": "Postman Test",
"amount": 50,
"date": "2020-11-15",
"category": "other"
}
Все работает так, как ожидалось. Но когда я добавляю следующую проверку:
{
"rules": {
"transactions": {
"$uid":{
".read": "auth != null amp;amp; auth.uid == $uid",
".write": "auth != null amp;amp; auth.uid == $uid",
".validate": "newData.hasChildren(['title','amount'])",
}
}
}
}
Он возвращает следующую ошибку: "error": "Permission denied"
Если я вставлю !newData.hasChildren(['title', 'amount'])
вместо этого, это сработает, поэтому я предполагаю, что он неправильно считывает поля.
Я должен упомянуть, что когда я пытаюсь использовать это правило на странице firebase, они работают, поэтому я в замешательстве.
Я прочитал документацию и искал похожие ошибки, но я не могу это исправить, поэтому буду признателен за любую помощь.
Большое вам спасибо.
Комментарии:
1. Вы можете добавить решение в качестве ответа на этот пост и пометить его как принятое.
2. Хорошо, спасибо, я это сделаю.
Ответ №1:
Я, наконец, смог найти решение, поэтому я бы опубликовал его здесь на случай, если у кого-то возникнет такая же проблема.
При использовании POST
in Firebase Realtime Database
он создает новый узел с новым автоматическим индексом, поэтому все, что мне нужно было добавить, это поле «$ id» (или любое другое имя) для учета этого, следующим образом:
{
"rules": {
"transactions": {
"$uid":{
".read": "auth.uid == $uid",
".write": "auth != null amp;amp; auth.uid == $uid",
"$id":{
".validate": "newData.hasChildren(['amount','category','type','date'])",
"amount": {
".validate": "newData.isNumber() amp;amp; newData.val() >= 0",
},
"category": {
".validate": "newData.isString()",
},
"type": {
".validate": "newData.isString()",
},
"date": {
".validate": "newData.isString()",
}
}
}
}
}
}