2

私の元のタイトルは「安全なユーザー アクセスのために、Firebase でユーザー (アカウント) データを構造化して保護する方法」でした。これがこの質問の領域であるため、代わりに、より一般的な質問を作成できると考えました。
私はhttps://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.htmlに精通していると言っていました
が、この記事と同じくらい素晴らしいですが、私の問題にはまったく当てはまりません。だからここに行きます。


まず、メール/パスワード認証タイプのシンプル ログインを使用します (ただし、ユーザーのメールの検証にサーバー側のコーディングが必要な場合は、代わりにペルソナを使用する可能性があります)。
ユーザー データ (読み取りユーザー アカウント) が格納された userData オブジェクトがあります。各ユーザーは、自分のアカウントに保存されているデータのみを読み取ることができる必要があります。すべてのユーザーがアクセスする実際のデータは、comingdata という別のノードに保存されます。
ユーザーが今後のデータのどのデータにアクセスできるかは、ユーザーが行った購入の種​​類によって決まります。
「サブスクリプション」タイプのユーザーは、サブスクリプションが期限切れになるまですべてのデータにアクセスできます。「now」変数を使用して、セキュリティ式でこれを実現できると思います。
「購入」タイプのものは、購入した(配列にリストされている)データのみにアクセスできます。
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 マングルを使用する必要があります。

"admin@mydomainDOTcom" : {...}

むしろ、userData ノードの作成時に「push()」「空」のユーザー アカウントを作成し、ユーザーのユーザー名を {"id" : "admin@mydomain.com"} プロパティとして保存する必要がありますか?
Firebase でセキュリティ ルールを設定して、購入が成功したとき (PayPal など) の書き込みを除いて、userData の内容を常に読み取り専用にするにはどうすればよいですか?
これは、サーバー コードに頼らなくても安全に実行できますか?
サーバーのみが Firebase にデータを書き込むことができるようにセキュリティ ルールを設定できることはわかっていますが、これにはサーバー側のコードが含まれ、有効な PayPal 支払い通知 (IPN) に応答して適切なデータを書き込むことになります。 -サーバー側のコーディングにあまり熟練していないため(node.jsを成功させることができるはずですが)、回避したい側のコードだけでなく、LAMPスタック共有サーバーは必要なVPSよりもはるかに安価であるためです。ノード用 (ああ、私は php を実行できません :( )。
クライアント コードは、素晴らしい Angular.js / angularFire コンボを使用して開発されます。Jared さん 、
お時間を割いていただきありがとうございます。

4

1 に答える 1

5

ここには 2 つの異なる質問があり、別々に処理されます。

  1. 為に "。" "," に置き換えることができます。Simple Login はこれを自動的に行います。たとえば、Persona プロバイダーを使用している場合、エスケープされた電子メール アドレスは userObject.id (および userObject.email の実際の電子メール アドレス) としてアクセスできます。

  2. 初めての場合を除き、読み取り専用レコードを作成するには、次のようなルールを使用できます。

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

これにより、一度書き込まれたレコードが変更されるのを防ぐことができます。

于 2013-09-26T19:21:54.283 に答える