Как денормализовать/структурировать данные в Firebase в контексте требований сложных правил безопасности?

Первоначально я назывался «Как структурировать и защитить данные пользователя (аккаунта) в Firebase для безопасного доступа пользователей». поскольку это область этого вопроса, но потом я подумал, что вместо этого можно было бы сформировать более общий вопрос. Сказав, что я знаком с
https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html
но какой бы замечательной ни была эта статья, она не совсем применима к моей проблеме, поэтому здесь я go.


Во-первых, я собираюсь использовать простой вход с аутентификацией по электронной почте/паролю (хотя вместо этого можно использовать Persona, если для проверки электронной почты пользователя потребуется кодирование на стороне сервера).< br> У меня есть объект userData с сохраненными в нем пользовательскими данными (чтение учетных записей пользователей). Требуется, чтобы каждый пользователь мог читать данные, хранящиеся только в его собственной учетной записи. Фактические данные, к которым будут иметь доступ все пользователи, будут храниться в отдельном узле с именем предстоящие данные.
Какие данные из предстоящих данных могут быть доступны пользователю, будет определяться типом покупки, которую совершил пользователь:
с типом «подписка» смогут получить доступ ко всем данным, пока не истечет срок их подписки. Я предполагаю, что переменная "now" может использоваться для достижения этого с помощью выражений безопасности.
Те, у кого тип "покупка", могут получить доступ только к купленным данным (перечисленным в массиве).
[email protected] необходимо иметь возможность читать все данные для всех пользователей, но записывать (и читать) только в предстоящий узел Data.

Итак, вот тестовая структура данных, которую я пытаюсь сохранить в Firebase:

new Firebase(url).update({
  userData: {
    "[email protected]" : {
      subscription : {expire : '9999999999999'},
      purchase : []
    },
    "[email protected]" : {
      subscription : {expire : '1379904665974'},
      purchase : ['upcomingData/-J47idp64ANBRmFS5rVY', 'upcomingData/-J47idpHg-pwzW1c-rfw', 'upcomingData/-J47idpLfIhlUQWTPc9y']
    },
    "[email protected]" : {
      subscription : {expire : '1379904734517'},
      purchase : ['upcomingData/-J47idp64ANBRmFS5rVY', 'upcomingData/-J47idpHg-pwzW1c-rfw', 'upcomingData/-J47idpLfIhlUQWTPc9y']
    }
  }
});

Это не работает из-за '.' символов.
Должен ли я использовать DOT mangle следующим образом:

"admin@mydomainDOTcom" : {...}

или, скорее, я должен 'push()' "очистить" учетные записи пользователей при создании в узле userData и сохранить в них имена пользователей как свойство {"id" : "[email protected]"}?
Как мне установить правила безопасности в Firebase, чтобы содержимое userData всегда было доступно только для чтения, за исключением записи во время успешной покупки (скажем, через PayPal)?
Можно ли это сделать безопасно, не прибегая к серверному коду? ?
Я знаю, что могу настроить правила безопасности, чтобы только сервер мог записывать данные в Firebase, но для этого потребуется код на стороне сервера, который затем запишет соответствующие данные в ответ на действительное платежное уведомление PayPal (IPN ) - код на стороне сервера, которого я бы предпочел избегать не только потому, что я не очень хорошо разбираюсь в кодировании на стороне сервера (хотя должен быть в состоянии преуспеть в node.js), но и потому, что общие серверы LAMP все еще намного дешевле чем VPS, необходимый для узла (и я не могу сделать php :( ).
Клиентский код будет разработан с использованием потрясающего Angular Комбинация .js и angularFire.
Цените свое время,
Джаред


person Jared Tomaszewski    schedule 26.09.2013    source источник


Ответы (1)


Здесь два разных вопроса, которые рассматриваются отдельно:

  1. За "." символы, вы можете заменить их на «,». Simple Login сделает это за вас автоматически, например, если вы используете провайдера Persona, экранированный адрес электронной почты будет доступен как userObject.id (и реальный адрес электронной почты в userObject.email).

  2. Чтобы создать записи только для чтения, за исключением первого раза, вы можете использовать правило вроде:

".write": "!data.exists()"

Это предотвратит изменение записи после ее однократной записи.

person Anant    schedule 26.09.2013