Advertisement
zsgomori

Recognize simultaneous logins with Firebase Presence

Feb 12th, 2020
3,354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // https://stackoverflow.com/questions/21321234/how-to-prevent-simultaneous-logins-of-the-same-user-with-firebase
  2.  
  3. const getUserRef = userId => firebase.database().ref(`/users/${userId}`);
  4.  
  5. const ensureUserSession = userId => {
  6.     const userRef = getUserRef(userId);
  7.  
  8.     return userRef.once(β€œvalue”).then(snapshot => {
  9.         if (!snapshot.exists()) {
  10.             return userRef.set({
  11.                 last_seen: firebase.database.ServerValue.TIMESTAMP
  12.             });
  13.         }
  14.  
  15.         const user = snapshot.val();
  16.  
  17.         if (user.is_online) {
  18.             throw new SessionAlreadyExists(...);
  19.         }
  20.        
  21.         return Promise.resolve();
  22.     });
  23. };
  24.  
  25. firebase.auth().onAuthStateChanged(user => {
  26.     if (user) {
  27.         return ensureUserSession(user.uid)
  28.             .then(() =>Β {
  29.                 const userRef = getUserRef(user.uid);
  30.                
  31.                 return userRef
  32.                     .onDisconnect()
  33.                     .set({
  34.                         is_online: false,
  35.                         last_seen: firebase.database.ServerValue.TIMESTAMP
  36.                     }).then(() =>
  37.                         userRef.set({
  38.                             is_online: true,
  39.                             last_seen: firebase.database.ServerValue.TIMESTAMP
  40.                         });
  41.                     );
  42.             }).catch(err => {
  43.                 console.error(err);
  44.  
  45.                 if (err instanceof SessionAlreadyExists) {
  46.                     return firebase.auth().signOut();
  47.                 }
  48.             });
  49.     }
  50. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement