2017-07-06 24 views
1

Firebaseのように、v2からv3.xのSDK(そして現在はv4)に移行したときに、自動認証の期限切れのオプションを削除して常時認証されたモデルを採用することにしました。Firebaseセッションの有効期限

これが提供する便利な機能ですが、これはFirebase-とFirebaseのSDKのためのみオプションであるとして、サイバーセキュリティの観点から、私はいくつかの問題を参照してくださいemail and password authenticationなどのトークンを生成しました(そのうちのいくつかはリンクされたGoogleグループの説明でうまく説明されています)。

終了ページでuser.signOut()に電話する一般的な提案には、いくつかの穴があります。つまり、クライアントがクラッシュした場合、このコードは決して実行されないため、ストラテジが分断されます。 「ページのロードにサインアウト」の提案も、その中に穴がありますたびにログインする

  1. 軍のすべてのユーザーをFirebaseとして
  2. がクライアントに最もすべてをプッシュする(ない目標)ページがロード/リロード、目標Firebaseをアクセスしようとするスクリプトを作成するために誰かを止めるものは何もは、私は、サイバーセキュリティの観点から、より良い仕事をして戦略を探していますuser.signOut()

を持たずに存在しない、それが可能にユーザーが「常に認証された」戦略にオプトインするデフォルトではなく選択します(つまり、 「Remember Me」ボタンを押して)。次のように私が思い付いた

1つの戦略は、次のとおりです。

    1. ユーザー兆候はそのセッションのために生成されたJWTを取得し、ユーザーが覚えて「を選択しなかった場合
    2. をFirebaseためにそれを書きますトークンをそのユーザトークンのリストから消去するonDisconnectハンドラを設定してください
    3. Firebaseのセキュリティルールでは、要求を行ったユーザのJWTがそのユーザのトークンのリストにあることを確認してください

    これは、ブラウザがクラッシュしてもonDisconnectメソッドが実行されるため、より安全です。 の場合、JWTはFirebaseルール変数(only the contents of the token)として使用できません!

    これらの問題/欠陥のあるアプローチに照らして、Firebaseによって生成されたトークンをブラウザが閉じるかクラッシュした後(またはあらかじめ決められた時間が経過しても)セッションを無効にするにはどうすればよいですか?

  • 答えて

    2

    ここに提案があります。 IDトークンにはauth_timeフィールドがあります。これはユーザーが認証した時間です。必要なセッション長を強制することができます。 https://firebase.google.com/docs/reference/security/database/#nowとauth.token.auth_timeを使用して、サーバー上のトークンを検証するか、データベースルールを使用してトークンを検証することができます。チェックhttps://firebase.google.com/docs/reference/security/database/#authtokenを確認してください。

    データにアクセスするには、ユーザーの再認証が必要です。再認証によって、トークンのauth_timeが更新されます。

    これは、すべてのIDトークンを追跡するのがスケールがよくなく、IDトークンが1時間後に期限切れになり、ユーザーがアプリに戻った後も新しいトークンが更新されますが、同じauth_timeが維持されるため、

    わからない、これはあなたの懸念を軽減しますが、Firebaseは、次の機能を検討している場合:

    1. Web認証のための永続性を指定する機能を。これは、sessionOnly authがFirebase 3.xでどのように動作したかと似ています。これにより、 "Remember Me"機能を実装しやすくなります。
    2. セッションを取り消す機能。
    +0

    ちょっと@bojeil、提案のおかげで。私は、マルチテナントのシナリオでは、いくつかの重要なケースがあると考えています(ユーザは、「auth_time」を更新することによって、同じアカウントにログインしている他のユーザのセッションを無意識に「拡張」しているかもしれませんが) 。これらの他の機能のタイムラインはどれですか? :) – MandM

    +0

    "あなたは知らないうちに" auth_timeを更新して同じアカウントにログインしている他のユーザーのセッションを拡張しているかもしれません "ということを意味します。 auth_timeは、再認証またはサインイン時にのみ更新されます。現時点では、これらの機能のための堅実なタイムラインはありません。 – bojeil

    +0

    私はユーザーAとユーザーBが別のマシンからサインインするという説明を書いていました。基本的にもう一方の 'auth_time 'を更新しましたが、' auth_time'は共有されていないので、それぞれのJWTのありがとう!考慮すべきもう一つの特徴は、別々のサーバーを必要とするのではなく、電子メールとパスワードの認証でカスタムJWTクレーム定義を可能にすることです。 – MandM

    関連する問題