web-dev-qa-db-ja.com

アプリからリモートでFirebase認証ユーザーを強制的にログアウトする方法

ユーザーを認証するためにfirebaseUIでfirebase authを使用するプロジェクトがあります。 Google、Facebook、メールプロバイダーを有効にしました。必要なのは、リモートでログアウトするか、一部のユーザーを無効にすることです。

ユーザーにアプリからログアウトしてほしい。 firebaseコンソールでユーザーを無効にしてみました。また、firebase admin SDK( https://firebase.google.com/docs/auth/admin/manage-sessions )を使用して更新トークンを取り消しました。

2日以上待っても、ユーザーがログインしていて、Firestoreデータにアクセスできることに気付きました。

私も行ってみました Firebaseは削除後もauthDataを取得しています

誰も私が間違っていることを指摘できますか?

11
Ashwin Valento

FCMでメッセージデータを送信して、強制的にログアウトすることができます。

たとえば、ユーザーがAndroid application。

  1. Firebase RealtimeのコレクションにFCMトークンを保存します。
  2. Androidサービス内のクライアントアプリ。 [〜#〜] link [〜#〜] を設定します。特別な文字列を含むメッセージを受信した場合、forceログアウトします。
  3. クラウド機能で必要なトリガーを作成し、データを送信します [〜#〜] link [〜#〜] ユーザーがログアウトする必要がある場合。

成功!

5

また、ユーザーをリモートで強制的にログアウトさせることもできません。ユーザーがサインインしているデバイスからサインアウトする必要があります。

一度作成されたアクセストークンを取り消す方法はありません。これは、ユーザーのアカウントを無効にしても、最大1時間アクセスし続ける可能性があることを意味します。

それが長すぎる場合、トリック(リンクした質問への私の答えでも述べられているように)は、データベース(または他の場所)でブロックされたユーザーのリストを維持し、セキュリティルール(または他の認証レイヤー)でそれをチェックすることです)。

たとえば、リアルタイムデータベースでは、ブロックされたユーザーのUIDのリストを作成できます。

banned_uids
  uid1: true
  uid2: true

そして、あなたのセキュリティルールでそれをチェックします:

".read": "auth.uid !== null && !root.child('banned_uids').child(auth.uid).exists()"
5

シナリオごとに、ユーザーが無効になったときにユーザーをログアウトする必要があると思います。

1つのグローバル変数を使用して保存TokenNo(共有設定またはsqliteにある可能性があります):

マニフェストに次のコードを追加します。

<service Android:name=".YourFirebaseMessagingService">
 <intent-filter>
     <action Android:name="com.google.firebase.MESSAGING_EVENT" />
 </intent-filter>
</service>

次のコードを追加します

public class LogoutOntokenchange extends FirebaseMessagingService{
   @Override
   public void onNewToken (String token){
     if(TokenNo=>1){ //if tokenNo >=1 means he already logged in
       TokenNo=0;
       FirebaseAuth.getInstance().signOut(); //Then call signout method
     }
     else{
       TokenNo=1; //store token no in db
     }
   }
}

そこで何が起こるの:
最初にログインしたユーザーがonNewTokenを呼び出したとき、それは別の状態になり、TokenNoは0から1に更新されます。
ユーザーを無効にすると、自動的にトークンが更新されます。その後、OnNewTokenが呼び出され、TokenNo> = 1になり、ユーザーがログアウトされます。

注:ユーザーが初めてログインするとき、つまりTokenNo変数が保存されていない場合は、0として保存します。

参照用: https://firebase.google.com/docs/reference/Android/com/google/firebase/messaging/FirebaseMessagingService

2
maneesh

Firestoreルールの設定を担当しているバックエンドプログラマーはその日はいな​​かったので、まだテストされていませんが、理論的にはこれで機能するはずです(そして、明日テストするものです)

ユーザーのステータスに基づいてUIの提供を担当するFirebaseAuth.AuthStateListenerを持つ

これは、ファイヤーストアのルールと組み合わされました

match /collection
allow read: if isAuth();

IsAuthは次のとおりです。

function isAuth() {
  return request.auth.uid != null;
}

ユーザーがログイン中に無効になっている場合、ユーザーがコレクションからデータを読み取ろうとするたびに拒否され、signOut()呼び出しが行われる必要があります。 AuthStateListenerはそれを検出し、ユーザーをサインアウトします。

0
AverageJoeDK