5

firebase 3を使用しています。 firebaseルールを書き込むとき、authオブジェクトにはuidとプロバイダのみが含まれます。これが電子メールアドレスを提供するように強化される可能性はありますか?firebaseルールの電子メールアドレスにアクセスする

私が解決しようとしている問題は、私が取り組んでいるサイトの所有者が自分の電子メールアドレスに基づいてユーザーの許可を得たいということです。

私は、ユーザオブジェクトをfirebase(電子メール)に保存し、それをルールの参照ポイントとして使用することを提案しました。 私が見ることができる問題は、誰かが完全な権限を持つユーザーの電子メールアドレスを知っていれば、コードをデバッグしてファイヤーベースに保存する前に電子メールアドレスを操作するのはかなり簡単なことです。他の人のメールアドレスと一緒にfirebase id。

これを安全にするために私が見ることができる唯一の方法は、firehassルールのauthオブジェクトに電子メールアドレスを提供することです。これはハッキングできません。

何か不足していますか?


MORE INFO


アイデアは、我々は、ユーザーの電子メールアドレスに場所名を追加することにより、特定の場所のためのデータへのアクセスを制御することができるということです。

  1. ユーザーでありますサイト管理者が手動で事前に作成し、データのサブセットへのアクセスを提供します。 例えば
-users 
    -user1Email 
    -locations 
     -someLocation:true 
     -someOtherLocation:true 
    1. ユーザーがGoogleを介して認証します。クライアント側では、我々はルールではauth.user.email

    2. で自分のメールアドレスを見ることができ、私は電子メールアドレスをエスケープする必要があります知っている

    locations : { 
        "$location": { 
         ".read": "root.hasChild('users/' + auth.email + '/locations/' + $location)", 
        } 
    } 
    

    のような何かをしたいです今のところそれを簡単に保つようにしています。

    これはシミュレータでテストしましたが、カスタムプロバイダを使用して電子メールを送信すると完全に機能しますが、googleを使用してルールの「認証」にはuidとプロバイダのプロパティのみがあり、電子メールはありません。

    代わりに(カスタムプロバイダーを使用する以外)、ユーザーが自分のアカウントを作成できるようにしてから、そのユーザーの電子メールアドレスではなくuidをキーとして場所を追加します彼らがすぐに言葉でそれを最初にログインするように、それを前もって設定できるようにする。

  • +0

    あなたが扱おうとしている正確なユースケースを説明できますか? 「彼は自分の火災の原因を知らないだろう」とはどういう意味ですか?あなたが期待していることをしようとすると、ユーザーは認証されますか? – adolfosrs

    +0

    申し訳ありませんが、コードをきれいにフォーマットするのに手間がかかっていましたが、今は読みやすいはずです。 – John

    +0

    電子メールアドレスはセキュリティルールの 'auth'変数で利用できるようになりました。 http://stackoverflow.com/questions/37986097/how-can-we-guarantee-that-the-email-saved-by-the-firebase-user-is-indeed-his-own –

    答えて

    1

    Firebaseチームは依然としてauthオブジェクトに電子メールを提供するよう努めており、あなたのルールauth.token.emailを使用していくつかの制限付きで見つけることができます。詳細はthis postをご覧ください。

    現在のFirebaseソリューションではすべてのニーズを処理できない場合は、回避策がいくつかあります。

    あなたは可能性があなたの現在の/users構造を維持したいので、新しいユーザーを登録するたびに、単に$uid: emailを格納する新しいブランチ/user_emailsで対応する電子メールにユーザーのuidをリンクします。あなたのルールは次のようになります。

    "user_emails": { 
        "$uid": { 
         ".write": "auth.uid == $uid", 
         ".validate": "!root.child('Users').hasChild(newData.val())" 
        } 
        }, 
        "locations": { 
        "$location": {  
         ".read": "root.hasChild('users/' + root.child('user_emails').child(auth.uid).val() + '/locations/' + $location)" 
        } 
        } 
    

    あなただけの権利ユーザーは、この新しいuser_emailsブランチを編集することができますことを保証するためにそれらを強化する必要があることに注意してください。

    +0

    あなたは、ユーザーのuidを対応する電子メールにリンクすると、手動で行うことを意味しますか?ユーザーがログインした後にプログラム的に もし完全にアクセス可能であることが知られているユーザーの電子メールアドレスを提供すると、このコードが悪意を持って呼び出される可能性があるので、私はセキュリティ問題を解決するとは思えません。そして、新しいfirebase idはフルアクセス権を持つユーザにリンクされます。 手作業の場合は、ユーザーがアクセスせずにログインできるようにしなければならないことを意味します。手動で追加する必要があります。これは避けようとしています。 – John

    +0

    @John firebaseルールを使用すると、ユーザが編集できる唯一のブランチが、自分のuidをキーとして持つことになります。 '/ user_emails'ブランチに追加できるルールの例を追加しました。 – adolfosrs

    +0

    @ジョンそしてはい。私はプログラム的に意味する。新しいユーザを '/ users'に登録して' createUser'を呼び出すか、何かをコールバックで 'ref.child(uid).set(email)'のようなものを必ず呼び出さなければなりません。 – adolfosrs

    関連する問題