Es ist nicht möglich zu sagen , ob ein Benutzer wird unterzeichnet werden , wenn ein Laden der Seite beginnt, gibt es eine Arbeit um , obwohl ist.
Sie können den letzten Authentifizierungsstatus in localStorage speichern, um ihn zwischen Sitzungen und zwischen Registerkarten beizubehalten.
Wenn die Seite geladen wird, können Sie optimistisch davon ausgehen, dass der Benutzer automatisch neu angemeldet wird, und den Dialog verschieben, bis Sie sicher sind (dh nach einem onAuthStateChanged
Brand). Andernfalls localStorage
können Sie den Dialog sofort anzeigen, wenn der Schlüssel leer ist.
Das Firebase- onAuthStateChanged
Ereignis wird ungefähr 2 Sekunden nach dem Laden der Seite ausgelöst.
// 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()
}
})
Ich benutze dies mit
React und
React -Router . Ich habe den obigen Code in
componentDidMount
meine App-Stammkomponente eingefügt. Dort im Render habe ich welche
PrivateRoutes
<Router>
<Switch>
<PrivateRoute
exact path={routes.DASHBOARD}
component={pages.Dashboard}
/>
...
Und so wird meine PrivateRoute implementiert:
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}}}
// />