Внедрение правил безопасности чтения и записи в Firebase

В моем приложении я хочу иметь представление «может читать» и «может писать». Когда приложение запускается без существующих параметров ("первый пользователь"), создаются 2 случайных хэша вместе с секретом приложения firebase, которые они отправляются в PHP FirebaseTokenGenerator для получения моего токена.

Затем я хочу сделать это:

  • Первый хэш («прочитанный хэш») представляет запись «анонимный пользователь».
  • Второй хэш («хэш записи») представляет собой «ключ», который является дочерней записью пользовательской записи.

Что выглядит так:

<appname>
    users
        <read_hash>
            key
                <write_hash>
            [other user related data]
                ...

Хэши можно использовать в качестве параметров URL, например. "myapp.com/#read_hash/write_hash"

Чего я хочу добиться, так это:

  • когда у пользователя есть только его read_hash (вызывающий только «myapp.com/#read_hash»), он должен иметь возможность ВИДЕТЬ все свои записи, которые он ввел в первый раз (когда приложение создает для него write_hash / «ключ»). Но ему не разрешено их изменять.
  • Когда он предоставляет свой write_hash (вызывая «myapp.com/#read_hash/write_hash»), запись в Firebase разрешена.

Мои правила безопасности:

{
    "rules": {
        "users": {
            "$user": {
                ".read": "$user == auth.read_hash",
                ".write": "$user == auth.read_hash && root.child('users').child($user).child('key').val() == auth.write_hash"
            }
        }
    }
}

Моя проблема: как мне сохранить write_hash в первый раз без моего правила безопасности «.write», запрещающего запись??

Любая другая идея, как этого добиться? Любые архитектурные / несоответствия?

Я использую эти библиотеки:

  • Backbone JS с backbone-firebase.js
  • FirebaseTokenGenerator PHP

Заранее спасибо.


person netzartist    schedule 15.05.2013    source источник
comment
Спасибо за ваши подсказки. Хотя проблема с Firebase, которая у меня была, была основана на другой проблеме;) ваши комментарии помогли мне точно решить проблему с записью.   -  person netzartist    schedule 23.05.2013


Ответы (2)


Во-первых, я должен отметить, что вы не должны никогда помещать секрет Firebase в свое приложение. Он всегда должен безопасно храниться на защищенном сервере. Ваш первоначальный вопрос предполагал, что вы отправляете токен на сервер с клиента.

Я бы предложил, чтобы read_hash был таким же, как идентификатор пользователя, а затем сохранял «ключ» в //key при первом создании пользователя.

Тогда я бы предложил следующую структуру правил:

{
  "rules": {
    "$userid": {
      ".read": "$userid == auth.read_hash",
      ".write": "!data.exists() || ($userid == auth.read_hash && data.child("key") == auth.write_hash)",
    }
  }
}
person Andrew Lee    schedule 15.05.2013

Предполагая, что у вас уже есть ключ записи хэша (поскольку вы уже прошли аутентификацию в соответствии с вашим примером), это будет работать:

{
    "rules": {
        "users": {
            "$user": {
                ".read": "$user == auth.read_hash",
                "$key": {
                    ".write": "$user == auth.read_hash && $key === auth.write_hash"
                }
            }
        }
    }
}

Если вам нужно создать хеш перед получением ключа, для какого-то странного варианта использования (маловероятно, но это даст вам некоторые ключевые сведения о правилах безопасности), вы можете сделать что-то вроде этого:

".write": "$user == auth.read_hash && (!data.exists() || $key === auth.write_hash)"
person Kato    schedule 15.05.2013