Я начинаю писать правила безопасности для своего мобильного приложения, используя firebase
. У меня есть ниже правила безопасности прямо сейчасПравила безопасности Firebase проверяют значение новых данных для аутентификации
{
"rules": {
".read": "auth != null",
".write": "auth != null || newData.child('appSecret').val() === '123'",
"queue": {
"tasks" : {
".indexOn": "_state"
}
}
}
}
В правиле записи, я проверяю либо данные auth
не является нулевым или данные, вставленные содержит предварительно бесспорное приложение секрет. Вторая часть правила - добавить задачи к firebase-queue
, чтобы получить пользовательский токен с сервера для аутентификации пользователя мобильного приложения. Я буду перемещать это правило до /queue/tasks
после добавления других правил для приложения.
У меня возникли проблемы с добавлением задач в очередь с приведенным выше правилом. Я пробовал писать в симуляторе, и я получаю следующий вывод.
Attempt to write {"appSecret":"123","task":"GET_AUTH_TOKEN"} to /queue/tasks/23232 with auth=null
/:.write: "auth != null || newData.child('appSecret').val() === '123'"
=> false
/queue
/queue/tasks
/queue/tasks/23232:<no rules>
No .write rule allowed the operation.
Write was denied.
Почему операция записи отказано, когда данные вставляются имеет appSecret
набор для 123
?
Update после ответа Франка
Безопасность не только проверка данных, которая вставляется, но и место, где она установлена. Итак, в моем правиле выше, я пытаюсь сказать, что когда вы вставляете данные в /
, убедитесь, что либо пользователь аутентифицирован, либо вставленные данные содержит дочерний элемент appSecret
со значением, установленным в 123
, и я пытаюсь вставить данные в месте нахождения /queue/tasks/23232
. Таким образом, по существу, что я вставив в /
является
{
'queue': {
'tasks': {
'23232': {
"appSecret":"123",
"task":"GET_AUTH_TOKEN"
}
}
}
}
Таким образом, новые данные, вставляемые не содержит ребенок appSecret
со значением 123
. Я обновил правило до
{
"rules": {
".read": "auth != null",
"queue": {
"tasks" : {
"$taskId" : {
".write": "newData.child('appSecret').val() == '123'",
},
".indexOn": "_state"
}
}
}
}
и операция записи разрешена. Конечно, теперь вам нужно будет добавить правила write
для других мест в вашей базе данных, потому что с вышеуказанными правилами write
не будет разрешено ни в каком другом месте.
Спасибо! Я думал, что правило будет просто проверять новые данные, которые вставляются, не глядя на место, где оно вставлено, но это имеет смысл, как только вы объяснили это. Я смог обновить свое правило и заставить его работать. –
'newData' представляет новые данные в местоположении, поэтому он включает в себя как данные, которые были записаны, так и любые существующие данные в немодифицированном местоположении. –