Nó là không thể nói cho dù một người sử dụng sẽ được ký kết khi một trang bắt đầu tải, có một công việc xung quanh mặc dù.
Bạn có thể ghi nhớ trạng thái xác thực cuối cùng vào localStorage để duy trì trạng thái đó giữa các phiên và giữa các tab.
Sau đó, khi trang bắt đầu tải, bạn có thể lạc quan cho rằng người dùng sẽ tự động đăng nhập lại và hoãn hộp thoại cho đến khi bạn có thể chắc chắn (tức là sau khi onAuthStateChanged
kích hoạt). Ngược lại, nếu localStorage
phím trống, bạn có thể hiển thị hộp thoại ngay lập tức.
Sự onAuthStateChanged
kiện firebase sẽ kích hoạt khoảng 2 giây sau khi tải trang.
// 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()
}
})
Tôi đang sử dụng cái này với
React và
react-router . Tôi đặt mã ở trên vào
componentDidMount
thành phần gốc Ứng dụng của mình. Ở đó, trong kết xuất, tôi có một số
PrivateRoutes
<Router>
<Switch>
<PrivateRoute
exact path={routes.DASHBOARD}
component={pages.Dashboard}
/>
...
Và đây là cách PrivateRoute của tôi được triển khai:
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}}}
// />