Estoy usando la autenticación de Firebase en mi aplicación iOS. ¿Hay alguna forma en Firebase cuando el usuario inicia sesión en mi aplicación con Firebase y luego cierra la sesión de ese usuario en todos los demás dispositivos (sesiones)? ¿Puedo hacer eso con el SDK de administración de Firebase?
Cuando tuve este problema, lo resolví con funciones en la nube. Visite este enlace para obtener más detalles https://firebase.google.com/docs/auth/admin/manage-sessions#revoke_refresh_tokens
Haz lo siguiente;
admin.auth().revokeRefreshTokens(uid) .then(() => { return admin.auth().getUser(uid); }) .then((userRecord) => { return new Date(userRecord.tokensValidAfterTime).getTime() / 1000; }) .then((timestamp) => { //return valid response to ios app to continue the user's login process });Los usuarios de Voila cerraron sesión. Espero que esto te ayude a resolver el problema.
Firebase no proporciona dicha característica. Tienes que gestionarlo tú mismo.
Aquí está el Firebase Doc y no han mencionado nada relacionado con el inicio de sesión de un solo usuario.
Esto es lo que puedes hacer para esto:
Tome un token en el nodo de usuario (donde guarda otros datos del usuario) en la base de datos de Firebase y vuelva a generarlo cada vez que inicie sesión en la aplicación. Haga coincidir este token con el token del usuario que ya ha iniciado sesión (que se guarda localmente) en appDidBecomeActive y appDidFinishLaunching o posiblemente cada uno tiempo que realiza cualquier operación con Firebase o puede ser en algún intervalo de tiempo fijo. Si los tokens son diferentes, cierre la sesión del usuario manualmente y llévelo a la pantalla de autenticación.
Lo que he hecho es:
Se creó una colección en firestore llamada "activeSessions". El correo electrónico del usuario como una identificación para el objeto y el campo "activeID" para almacenar la identificación de la sesión más reciente.
en el código de la página de inicio de sesión:
Generando una identificación para una sesión de usuario cada vez que el usuario inicia sesión. Agregue esta identificación al almacenamiento local (debe limpiarse cada vez antes de agregar). Reemplace "activeID" por la identificación generada en la colección "activeSessions" con el correo electrónico del usuario actual.
function addToActiveSession() { var sesID = gen(); var db = firebase.firestore(); localStorage.setItem('userID', sesID); db.collection("activeSessions").doc(firebase.auth().currentUser.email).set({ activeID: sesID }).catch(function (error) { console.error("Error writing document: ", error); }); } function gen() { var buf = new Uint8Array(1); window.crypto.getRandomValues(buf); return buf[0]; } function signin(){ firebase.auth().signInWithEmailAndPassword(email, password).then(function (user) { localStorage.clear(); addToActiveSession(); } }), function (error) { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; if (errorCode === 'auth/wrong-password') { alert('wrong pass'); } else { alert(errorMessage); } console.log(error); }; }Luego, verifico en cada página si la sesión de identificación en el almacenamiento local es la misma que "activeID" en Firestore, si no, cierre la sesión.
function checkSession(){ var db = firebase.firestore(); var docRef = db.collection("activeSessions").doc(firebase.auth().currentUser.email); docRef.get().then(function (doc) { alert(doc.data().activeID); alert(localStorage.getItem('userID')); if (doc.data().activeID != localStorage.getItem('userID')) { alert("bie bie"); firebase.auth().signOut().then(() => { window.location.href = "signin.html"; }).catch((error) => { // An error happened. }); window.location.href = "accountone.html"; } else{alert("vse ok");} }).catch(function (error) { console.log("Error getting document:", error); }); }PD: la ventana debe actualizarse para cerrar la sesión inactiva.