2

我最初的标题是“如何在 Firebase 中构建和保护用户(帐户)数据以确保用户访问安全”。因为这是这个问题的领域,但后来我认为可以形成一个更一般的问题。
话虽如此,我对https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html很熟悉,
但是尽管这篇文章很棒,但它并不完全适用于我的问题,所以我走了。


首先,我将使用电子邮件/密码身份验证类型的简单登录(尽管如果验证用户电子邮件必须涉及服务器端编码,则可能使用 Persona 代替)。
我有一个 userData 对象,其中存储了用户数据(读取用户帐户)。要求每个用户只能读取存储在自己帐户中的数据。所有用户将要访问的实际数据将存储在一个名为即将到来的数据的单独节点中。
用户可以访问来自即将到来的数据的哪些数据将取决于用户购买的类型:
具有“订阅”类型的用户将能够访问所有数据,直到他们的订阅到期。我认为“现在”变量可用于通过安全表达式来实现这一点。
那些具有“购买”类型的人只能访问购买的数据(列在数组中)。
admin@mydomain.com 需要能够读取所有用户的所有数据,但只能写入(和读取)到即将到来的数据节点。

所以这是我试图保存到 Firebase 的测试数据结构:

new Firebase(url).update({
  userData: {
    "admin@mydomain.com" : {
      subscription : {expire : '9999999999999'},
      purchase : []
    },
    "testUser@somwhere.com" : {
      subscription : {expire : '1379904665974'},
      purchase : ['upcomingData/-J47idp64ANBRmFS5rVY', 'upcomingData/-J47idpHg-pwzW1c-rfw', 'upcomingData/-J47idpLfIhlUQWTPc9y']
    },
    "testUser2@somwhereelse.co.uk" : {
      subscription : {expire : '1379904734517'},
      purchase : ['upcomingData/-J47idp64ANBRmFS5rVY', 'upcomingData/-J47idpHg-pwzW1c-rfw', 'upcomingData/-J47idpLfIhlUQWTPc9y']
    }
  }
});

这不起作用,因为'。' 人物。
我应该像这样选择 DOT mangle:

"admin@mydomainDOTcom" : {...}

或者我应该在创建到 userData 节点时“推送()”“空”用户帐户并将用户的用户名保存为 {"id" : "admin@mydomain.com"} 属性?
如何在 Firebase 中设置安全规则,以便 userData 的内容在任何时候都可以是只读的,但在成功购买时(比如使用 PayPal)写入除外?
这可以安全地完成而无需求助于服务器代码吗?
我知道我可以设置安全规则,以便只有服务器可以将数据写入 Firebase,但这将涉及服务器端代码,该代码随后将写入适当的数据以响应有效的 PayPal 支付通知 (IPN) - 服务器-side code 我宁愿避免,不仅因为我不是很精通服务器端编码(尽管应该能够成功 node.js),而且因为 LAMP 堆叠共享服务器仍然比所需的 VPS 便宜得多对于 node (aaand 我不能做 php :( )。
客户端代码将使用很棒的 Angular.js / angularFire 组合开发。
感谢你的时间,
Jared

4

1 回答 1

5

这里有两个不同的问题,分别处理:

  1. 为了 ”。” 字符,您可以将它们替换为“,”。简单登录会自动为您执行此操作,例如,如果您使用 Persona 提供程序,则转义的电子邮件地址将作为 userObject.id(以及 userObject.email 中的真实电子邮件地址)访问。

  2. 要创建只读记录,除了第一次,您可以使用如下规则:

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

这将防止记录在写入一次后被修改。

于 2013-09-26T19:21:54.283 回答