javascript - recordar - register user in firebase
¿Cómo detecto si un usuario ya inició sesión en Firebase? (7)
No es posible saber si un usuario estará firmado cuando una página comienza a cargarse, aunque hay una solución alternativa.
Puede memorizar el último estado de autenticación en localStorage para conservarlo entre sesiones y entre pestañas.
Luego, cuando la página comienza a cargarse, puede asumir de manera optimista que el usuario volverá a iniciar
onAuthStateChanged
automáticamente y posponer el diálogo hasta que pueda estar seguro (es decir, después de los incendios de
onAuthStateChanged
).
De lo contrario, si la clave
localStorage
está vacía, puede mostrar el cuadro de diálogo de inmediato.
El evento firebase
onAuthStateChanged
se disparará aproximadamente
2 segundos
después de cargar una página.
// optimistically assume user will be logged in automatically
// e.g. if (!!localStorage.getItem(''myPage.expectSignIn'')) showDialog()
firebase.auth().onAuthStateChanged(user => {
if (user) {
localStorage.setItem(''myPage.expectSignIn'', ''1'')
} else {
localStorage.removeItem(''myPage.expectSignIn'')
// Implement logic to trigger the login dialog here or redirect to sign-in page.
// e.g. showDialog()
}
})
componentDidMount
de mi componente raíz de la aplicación.
Allí, en el render, tengo algunas
PrivateRoutes
<Router>
<Switch>
<PrivateRoute
exact path={routes.DASHBOARD}
component={pages.Dashboard}
/>
...
Y así es como se implementa mi PrivateRoute:
export default function PrivateRoute(props) {
return firebase.auth().currentUser != null
? <Route {...props}/>
: localStorage.getItem(''myPage.expectSignIn'')
// if user is expected to sign in automatically, display Spinner, otherwise redirect to login page.
? <Spinner centered size={400}/>
: (
<>
Redirecting to sign in page.
{ location.replace(`/login?from=${props.path}`) }
</>
)
}
// Using router Redirect instead of location.replace
// <Redirect
// from={props.path}
// to={{pathname: routes.SIGN_IN, state: {from: props.path}}}
// />
Estoy usando la API de nodo de Firebase en mis archivos javascript para iniciar sesión en Google.
firebase.initializeApp(config);
let provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider);
Esto funciona bien y el usuario puede iniciar sesión con sus credenciales de Google. Cuando el usuario visita la página nuevamente, la ventana emergente se abre nuevamente, pero como ya ha iniciado sesión, la ventana emergente se cierra sin requerir ninguna interacción por parte del usuario. ¿Hay alguna forma de verificar si ya hay un usuario conectado antes de que aparezca la ventana emergente?
No es necesario usar la función onAuthStateChanged () en este escenario.
Puede detectar fácilmente si el usuario está conectado o no ejecutando:
var user = firebase.auth().currentUser;
Para aquellos que enfrentan el problema de "retorno nulo", es solo porque no están esperando que se complete la llamada de Firebase.
Supongamos que realiza la acción de inicio de sesión en la página A y luego invoca la página B, en la página B puede llamar al siguiente código JS para probar el comportamiento esperado:
var config = {
apiKey: "....",
authDomain: "...",
databaseURL: "...",
projectId: "..",
storageBucket: "..",
messagingSenderId: ".."
};
firebase.initializeApp(config);
$( document ).ready(function() {
console.log( "testing.." );
var user = firebase.auth().currentUser;
console.log(user);
});
Si el usuario está registrado, entonces "var user" contendrá la carga útil JSON esperada, de lo contrario, será simplemente "nulo"
Y eso es todo lo que necesitas.
Saludos
Otra forma es usar lo mismo que usa Firebase.
Por ejemplo, cuando el usuario inicia sesión, firebase almacena los siguientes detalles en el almacenamiento local. Cuando el usuario vuelve a la página, firebase usa el mismo método para identificar si el usuario debe iniciar sesión automáticamente.
ATENCIÓN: ya que Firebase no enumera ni recomienda esto. Puede llamar a este método una forma no oficial de hacerlo. Lo que significa más adelante si Firebase cambia su funcionamiento interno, este método puede no funcionar. O en resumen. ¡Úselo bajo su propio riesgo! :)
Primero importa lo siguiente
import Firebase
import FirebaseAuth
Que
// Check if logged in
if Auth.auth().currentUser == nil {
// Do smth if user is not logged in
}
También puede verificar si hay un usuario actual
var user = firebase.auth().currentUser;
if (user) {
// User is signed in.
} else {
// No user is signed in.
}
use
Firebase.getAuth()
.
Devuelve el estado actual del cliente Firebase.
De lo contrario, el valor de retorno es
null
Aquí están los documentos:
https://www.firebase.com/docs/web/api/firebase/getauth.html
https://firebase.google.com/docs/auth/web/manage-users
Debe agregar un observador de cambio de estado de autenticación.
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
} else {
// No user is signed in.
}
});