Comment éviter les connexions simultanées du même utilisateur avec Firebase?

J'aimerais que la nouvelle session soit essentiellement déconnectée de toute session précédente. Par exemple, lorsque vous êtes dans une session authentifiée dans un ordinateur, le démarrage d'une nouvelle session sur un autre ordinateur et l'authentification avec une base de travail sur notre application fermeront l'autre session sur le premier ordinateur.

Je n'ai pu trouver aucune méthode qui me permette de me déconnecter d'une session "à distance". Je sais que je peux unuth () et goOffline () à partir d'une session. Mais comment puis-je le faire à partir d'une session autonome différente du même utilisateur?

Merci pour l'aide!

Informations de fond:

  1. J'utilise une connexion simple par courrier électronique / mot de passe pour l'authentification par firebase
  2. Je n'ai pas encore de configuration de règles de sécurité, bien que cela soit en cours
  3. J'utilise Javascript avec Firebase

L'idée générale est que vous souhaitez créer des méta-données dans Firebase qui vous indique le nombre d'emplacements auxquels un utilisateur est connecté. Ensuite, vous pouvez restreindre leur accès en utilisant ces informations.

Pour ce faire, vous devrez générer vos propres tokens (afin que les informations soient disponibles pour vos règles de sécurité).

1) Générer un jeton

Utilisez une connexion personnalisée pour générer vos propres jetons. Chaque jeton doit contenir une ID unique pour le client (adresse IP? UUID?)

var FirebaseTokenGenerator = require("firebase-token-generator"); var tokenGenerator = new FirebaseTokenGenerator(YOUR_FIREBASE_SECRET); var token = tokenGenerator.createToken({ id: USER_ID, location_id: IP_ADDRESS }); 

2) Utiliser la présence pour stocker l'emplacement_id de l'utilisateur

Consultez l' encadré de présence de gestion pour plus de détails:

 var fb = new Firebase(URL); // after getting auth token back from your server var parts = deconstructJWT(token); var ref = fb.child('logged_in_users/'+token.id); // store the user's location id ref.set(token.location_id); // remove location id when user logs out ref.onDisconnect().remove(); // Helper function to extract claims from a JWT. Does *not* verify the // validity of the token. // credits: https://github.com/firebase/angularFire/blob/e8c1d33f34ee5461c0bcd01fc316bcf0649deec6/angularfire.js function deconstructJWT(token) { var segments = token.split("."); if (!segments instanceof Array || segments.length !== 3) { throw new Error("Invalid JWT"); } var claims = segments[1]; if (window.atob) { return JSON.parse(decodeURIComponent(escape(window.atob(claims)))); } return token; } 

3) Ajouter des règles de sécurité

Dans les règles de sécurité, appliquez que seul l'emplacement unique actuel peut lire les données

 { "some_restricted_path": { ".read": "root.child('logged_in_users/'+auth.id).val() === auth.location_id" } } 

4) Contrôle l'accès en écriture à des utilisateurs enregistrés

Vous voudrez configurer un système de contrôle de l'accès en écriture à des utilisateurs enregistrés. De toute évidence, un utilisateur ne devrait pouvoir écrire que dans son propre enregistrement. Si vous souhaitez que la première tentative de connexion soit toujours gagnante, évitez l'écriture si une valeur existe (jusqu'à ce qu'elle se déconnecte) en utilisant ".write": "!data.exists()"

Cependant, vous pouvez simplifier considérablement en permettant à la dernière connexion de gagner, auquel cas elle écrase l'ancienne valeur de l'emplacement et les connexions précédentes seront invalidées et ne seront pas lues.

5) Ce n'est pas une solution pour contrôler le nombre de concurrents

Vous ne pouvez pas utiliser ceci pour empêcher plusieurs concurrents de votre base Firebase. Voir goOffline () et goOnline () pour plus de données sur l'accomplissement de cette (ou obtenir un plan payé afin que vous n'ayez aucun capuchon sur les connexions).