Первоначально я назывался «Как структурировать и защитить данные пользователя (аккаунта) в 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.
Цените свое время,
Джаред