3

Firebaseを使用して次の動作を実現しようとしています:

  • ユーザーは Firebase Authentication を使用してログインします
  • ユーザーが Firebase Storage にファイルをアップロードする
  • ユーザーが別のユーザーの電子メール アドレスを入力します。このユーザー アカウントは既に存在している可能性があります。そうでない場合、受信者はサインアップを促す電子メールを受け取ります。
  • アップロードされたファイルは、アップロードしたユーザー (読み取り/書き込み) と、上記の電子メール アドレスを持つ他のユーザー (読み取り専用) のみが利用できるようになります。

これは私がこれまで試してきたことです:

  • FirebaseAuth を使用してサインアップした後、ユーザーのメール アドレスをuidReal-Time Database に保存します。
  • ユーザーがファイルをアップロードし、受信者の電子メール アドレスを入力した後、私は Real-Time Database でそのアドレスを確認します。存在する場合は、受信者を取得uidし、ファイルのメタデータに保存します。
  • 私の Firebase Storage セキュリティ ルールでは、ファイル メタデータに保存されているものとauth.uid一致するかどうかを確認します。uid

これで問題なく動作するはずですが、ユーザー アカウントがまだ存在しない場合はどうすればよいでしょうか。

  • ユーザーが受信者の電子メール アドレスを入力すると、新しいアカウントを作成できます。ただし、その場合、パスワードを指定する必要があります。ランダムなパスワードを指定してパスワード リセット メールを使用することもできますが、リセット メールを完全にカスタマイズすることはできないため、ユーザー エクスペリエンスは良くありません。

  • 新しいアカウントをすぐに作成しない場合、このメール アドレスを持つユーザーだけがファイルにアクセスできるようにするにはどうすればよいですか? ファイルのメタデータに電子メール アドレスを保存することは、後で変更される可能性があるため機能しません。

ここで複雑に考えすぎているような気がします。これを達成する簡単な方法はありますか、それとも何かを見落としていますか?

編集: もう少し調査しましたが、これを行う 1 つの方法は、Firebase Storage ガイドhereで提案されているカスタム認証トークンを使用することだと思います。ただし、それには独自の認証サーバーをセットアップする必要があり、そもそも Firebase Authentication を使用する目的が無効になります。これを達成する簡単な方法はありますか?

4

2 に答える 2

2

これはかなり簡単です。

files
  file_id_0
    file_name: My File
    read_write: uid_0
    read_only:
      uid_1: true
      uid_2: true

もちろんユーザーもいます

users
  uid_0
    name: Larry
    email: larry@stooges.com
  uid_1
    name: Curly
    email: curly@stooges.com
  uid_2
    name: Moe
    email: moe@stooges.com

そしていくつかの気の利いた概念的なルール

rules
  .read: false
  .writ: false
  files
    $file_id
      //give the person that uploaded the file read access to this node as well as
      //  any user id that exists in the read_only node
      .read: root.child('files').child($file_id).child('read_write').val = auth.uid ||
            root.child('files').child($file_id).child("read_only').child(auth.uid) = true
     //write access only to the user that created it
     .write: root.child('files').child($file_id).child('read_write').val = auth.uid

それはかなり近いです。

そのため、uid_0 がファイル My File をアップロードすると、ファイルは file_id_0 に保存されます。そのユーザーは、別のユーザーをメール (存在すると仮定) でそのファイルに「招待」します。この場合、uid_0 は uid_1 と uid_2 を招待し、それらのユーザー ID は file_id_0 ノードに書き込まれます。これらは、これら 2 人のユーザーの /users ノードを照会することによって取得されます。

問題は、まだ存在していない別のユーザーを招待することです。

彼らがそこで遊んでいるのは、メールウォッチリストノードを持つことだと思います.

watch_list
   uid_0
     moe@stooges.com:  file_id_0

各ユーザーは users ノードを監視し、新しく追加されたユーザーの電子メールがウォッチ リストに存在するかどうかを監視します (uid_0 は moe@stooges.com を監視しています)。次に、それらを file_id_0 /read_only ノードに追加し、ウォッチ リストから削除します。

私が今書いたことを見ると、少しエレガントではないので、おそらくもっと良い方法があります.

于 2016-06-14T22:10:26.043 に答える