Це неможливо сказати , є чи користувач волі бути підписаний , коли сторінка починається завантаження, є робота навколо , хоча.
Ви можете запам’ятати останній стан авторизації у localStorage, щоб зберігати його між сеансами та між вкладками.
Потім, коли сторінка почне завантажуватися, ви можете оптимістично припустити, що користувач автоматично переввійде в систему і відкласти діалогове вікно, поки ви не будете впевнені (тобто після onAuthStateChanged
пожежі). В іншому випадку, якщо localStorage
ключ порожній, ви можете відразу показати діалогове вікно.
onAuthStateChanged
Подія firebase запуститься приблизно через 2 секунди після завантаження сторінки.
// 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()
}
})
Я використовую це разом з
React та
response-router . Я помістив наведений вище код у
componentDidMount
свій кореневий компонент програми. Там, у візуалізації, я їх маю
PrivateRoutes
<Router>
<Switch>
<PrivateRoute
exact path={routes.DASHBOARD}
component={pages.Dashboard}
/>
...
І ось як реалізований мій 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}}}
// />