web-dev-qa-db-fra.com

Comment forcer l'utilisateur autogiciel firebase à se déconnecter de l'application à distance

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?

6
Ashwin Valento

Vous pouvez envoyer un message avec FCM pour forcer la déconnexion. 

Par exemple, si les utilisateurs utilisent l'application Android. 

  1. Enregistrez le jeton FCM dans une collection dans firebase Realtime.
  2. configurer l'application client Android, dans le service. LINK Vous devez faire en sorte de recevoir un message avec une chaîne spéciale, obliger à vous déconnecter.
  3. déclenchez le déclencheur dont vous avez besoin dans les fonctions de cloud, pour envoyer les données LINK lorsque vous souhaitez que l'utilisateur se déconnecte. 

SUCCÈS! 

3
Mike Brian Olivera

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()"
3

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

2
maneesh

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.

0
AverageJoeDK