J'ai un projet qui utilise l'authentification firebase avec firebaseUI pour authentifier les utilisateurs. J'ai activé les fournisseurs Google, Facebook et de messagerie. Ce dont j'ai besoin, c'est de déconnecter à distance ou de désactiver certains utilisateurs.
Je veux que les utilisateurs se déconnectent de l'application pour le faire. J'ai essayé de désactiver l'utilisateur dans la console Firebase et j'ai également utilisé le SDK d'administration Firebase ( https://firebase.google.com/docs/auth/admin/manage-sessions ) pour annuler les jetons d'actualisation.
J'ai attendu plus de 2 jours et j'ai quand même remarqué que l'utilisateur était connecté et pouvait accéder aux données du magasin.
J'ai également essayé et essayé Firebase est toujours en train de récupérer authData après suppression
Quelqu'un peut-il indiquer ce que je fais mal?
Vous pouvez envoyer un message avec FCM pour forcer la déconnexion.
Par exemple, si les utilisateurs utilisent l'application Android.
SUCCÈS!
Vous ne pouvez pas non plus forcer à distance un utilisateur à se déconnecter. Toute déconnexion devra avoir lieu à partir du périphérique auquel l'utilisateur est connecté.
Il n’existe aucun moyen de révoquer un jeton d’accès une fois l’impression effectuée. Cela signifie que même si vous désactivez le compte de l'utilisateur, celui-ci peut continuer à y accéder pendant une heure maximum.
Si cela est trop long, le truc (comme mentionné également dans ma réponse à la question que vous avez liée) est de maintenir une liste des utilisateurs bloqués dans votre base de données (ou ailleurs), puis de vérifier par rapport à celle de vos règles de sécurité ).
Par exemple, dans la base de données temps réel, vous pouvez créer une liste des UID d'utilisateurs bloqués:
banned_uids
uid1: true
uid2: true
Et vérifiez ensuite dans vos règles de sécurité avec:
".read": "auth.uid !== null && !root.child('banned_uids').child(auth.uid).exists()"
Selon vos scénarios, je suppose que vous devez obliger l'utilisateur à se déconnecter lorsque l'utilisateur est désactivé .
Utilisez une variable globale pour stocker TokenNo (il peut s'agir d'une préférence partagée ou d'une sqlite):
Ajoutez le code suivant à votre manifeste:
<service Android:name=".YourFirebaseMessagingService">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Ajoutez le code suivant dans votre
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
}
}
}
Que se passe t-il ici:
Lorsque l'utilisateur connecté pour la première fois, onNewToken est appelé, puis passe à autre chose, TokenNo est mis à jour de 0 à 1.
Lorsque vous désactivez un utilisateur, le jeton est automatiquement actualisé. Ensuite, OnNewToken est appelé, puis TokenNo> = 1 pour que l'utilisateur soit déconnecté .
NOTE: Lorsque l'utilisateur se connecte pour la première fois, c'est-à-dire si la variable TokenNo n'est pas stockée, enregistrez-la sous 0 .
Pour référence: https://firebase.google.com/docs/reference/Android/com/google/firebase/messaging/FirebaseMessagingService
Pas encore testé, car notre programmeur backend, responsable de la configuration des règles Firestore, était parti, mais en théorie cela devrait marcher: (et c'est quelque chose que je testerai demain)
Avoir un FirebaseAuth.AuthStateListener chargé de servir l’UI en fonction du statut de l’utilisateur
Ceci combiné avec les règles de Firestore
match /collection
allow read: if isAuth();
Où estAuth est:
function isAuth() {
return request.auth.uid != null;
}
Si l'utilisateur est ensuite désactivé, tout en étant connecté, chaque fois qu'il tente de lire les données de la collection, il doit être refusé et un appel signOut () doit être effectué . AuthStateListener le détecte et signe l'utilisateur sur.