Правила проверки базы данных Firebase в реальном времени не работают

#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()",
            }
            
        }
      }
    }
  }
}