ユーザーを認証するためにfirebaseUIでfirebase authを使用するプロジェクトがあります。 Google、Facebook、メールプロバイダーを有効にしました。必要なのは、リモートでログアウトするか、一部のユーザーを無効にすることです。
ユーザーにアプリからログアウトしてほしい。 firebaseコンソールでユーザーを無効にしてみました。また、firebase admin SDK( https://firebase.google.com/docs/auth/admin/manage-sessions )を使用して更新トークンを取り消しました。
2日以上待っても、ユーザーがログインしていて、Firestoreデータにアクセスできることに気付きました。
私も行ってみました Firebaseは削除後もauthDataを取得しています
誰も私が間違っていることを指摘できますか?
FCMでメッセージデータを送信して、強制的にログアウトすることができます。
たとえば、ユーザーがAndroid application。
成功!
また、ユーザーをリモートで強制的にログアウトさせることもできません。ユーザーがサインインしているデバイスからサインアウトする必要があります。
一度作成されたアクセストークンを取り消す方法はありません。これは、ユーザーのアカウントを無効にしても、最大1時間アクセスし続ける可能性があることを意味します。
それが長すぎる場合、トリック(リンクした質問への私の答えでも述べられているように)は、データベース(または他の場所)でブロックされたユーザーのリストを維持し、セキュリティルール(または他の認証レイヤー)でそれをチェックすることです)。
たとえば、リアルタイムデータベースでは、ブロックされたユーザーのUIDのリストを作成できます。
banned_uids
uid1: true
uid2: true
そして、あなたのセキュリティルールでそれをチェックします:
".read": "auth.uid !== null && !root.child('banned_uids').child(auth.uid).exists()"
シナリオごとに、ユーザーが無効になったときにユーザーをログアウトする必要があると思います。
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
Firestoreルールの設定を担当しているバックエンドプログラマーはその日はいなかったので、まだテストされていませんが、理論的にはこれで機能するはずです(そして、明日テストするものです)
ユーザーのステータスに基づいてUIの提供を担当するFirebaseAuth.AuthStateListenerを持つ
これは、ファイヤーストアのルールと組み合わされました
match /collection
allow read: if isAuth();
IsAuthは次のとおりです。
function isAuth() {
return request.auth.uid != null;
}
ユーザーがログイン中に無効になっている場合、ユーザーがコレクションからデータを読み取ろうとするたびに拒否され、signOut()呼び出しが行われる必要があります。 AuthStateListenerはそれを検出し、ユーザーをサインアウトします。