【发布时间】:2021-01-17 23:31:38
【问题描述】:
我正在尝试在 React-Ionic 应用程序中为 Firebase 身份验证设置上下文,其中包含一些未经身份验证的情况下不应访问的受保护路由。到目前为止,它有点工作,但不完全。我可以毫无问题地登录并使用受保护的路线导航页面,但是一旦我刷新页面,它就会带我回到登录页面,就好像我没有经过身份验证一样。
我很确定我在某处搞砸了,但无法检测到哪里(实际上可能整个事情都被错误地实现了,因为我对此很陌生并且仍在学习)。
这是我的文件到目前为止的样子(没有导入和其他东西,只是核心部分):
App.tsx:
const App: React.FC = () => {
const authContext = useContext(AuthContext);
useEffect(() => {
console.log(authContext) **//**
}, [])
return (
<IonApp>
<IonReactRouter>
<IonRouterOutlet>
<Route exact path="/" component={PageLogin} />
<ProtectedRoute path="/secure/home" component={PageHome} isAuthenticated={authContext.authenticated!}/>
<ProtectedRoute path="/secure/lot/:lotId" component={PageLotOverview} isAuthenticated={authContext.authenticated!}/>
<ProtectedRoute path="/secure/shipment/:shipmentId" component={PageShipmentOverview} isAuthenticated={authContext.authenticated!}/>
</IonRouterOutlet>
</IonReactRouter>
</IonApp>
)
}
AuthProvider.tsx:
export const AuthContext = React.createContext<Partial<ContextProps>>({});
export const AuthProvider = ({ children }: any) => {
const [user, setUser] = useState(null as firebase.User | null);
const [loadingAuthState, setLoadingAuthState] = useState(true);
useEffect(() => {
firebase.auth().onAuthStateChanged((user: any) => {
setUser(user);
setLoadingAuthState(false);
});
}, []);
return (
<AuthContext.Provider
value={{
user,
authenticated: user !== null,
setUser,
loadingAuthState
}}>
{children}
</AuthContext.Provider>
);
}
ProtectedRoute.tsx:
interface ProtectedRouteProps extends RouteProps {
component: React.ComponentType<any>;
path: string;
isAuthenticated: boolean
}
export const ProtectedRoute: React.FC<ProtectedRouteProps> = ({ component: Component, path, isAuthenticated }) => {
useEffect(() => {
console.log("from protected ROUTE", isAuthenticated)
}, [])
return (
<Route path={path} render={() => isAuthenticated ? <Component /> : <Redirect to="/" />} />
);
};
index.tsx:
ReactDOM.render(
<AuthProvider>
<App />
</AuthProvider>
, document.getElementById('root'));
如果我能提供更多有用的信息,请告诉我。提前感谢您的帮助。
【问题讨论】:
标签: reactjs typescript firebase ionic-framework