Es no es posible decir si un usuario va a ser firmada cuando se inicia una página de carga, hay un trabajo alrededor sin embargo.
Puede memorizar el último estado de autenticación en localStorage para conservarlo entre sesiones y entre pestañas.
Luego, cuando la página comience a cargarse, puede asumir con optimismo que el usuario volverá a iniciar sesión automáticamente y pospondrá el cuadro de diálogo hasta que pueda estar seguro (es decir, después de los onAuthStateChanged
incendios). De lo contrario, si ellocalStorage
clave está vacía, puede mostrar el cuadro de diálogo de inmediato.
El onAuthStateChanged
evento de base de fuego se activará aproximadamente 2 segundos después de que se cargue una página.
// User signed out in previous session, show dialog immediately because there will be no auto-login
if (!localStorage.getItem('myPage.expectSignIn')) showDialog() // or redirect to sign-in page
firebase.auth().onAuthStateChanged(user => {
if (user) {
// User just signed in, we should not display dialog next time because of firebase auto-login
localStorage.setItem('myPage.expectSignIn', '1')
} else {
// User just signed-out or auto-login failed, we will show sign-in form immediately the next time he loads the page
localStorage.removeItem('myPage.expectSignIn')
// Here implement logic to trigger the login dialog or redirect to sign-in page, if necessary. Don't redirect if dialog is already visible.
// e.g. showDialog()
}
})
Estoy usando esto con
React y
react-router . Puse el código anterior en el
componentDidMount
componente raíz de mi aplicación. Allí, en el render, tengo algunos
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}}}
// />