【发布时间】:2021-08-31 14:00:56
【问题描述】:
我有一个 React 受保护的路由组件,它包裹着我的路由以启用对它们的身份验证。受保护的路由调用 API 端点来检查存储在 HTTP Only cookie 中的 JWT 是否有效。如果是,则呈现与请求的路由关联的组件,如果不是,则返回登录页面。
import React, { useState, useContext } from 'react';
import { Route, Redirect } from 'react-router-dom';
import axios from 'axios';
import { UserContext } from '../functions/UserContext';
const ProtectedRoute = ({ component: Component, ...rest }) => {
const [isAuthenticated, setIsAuthenticated] = useState(0);
const [gotResponse, setGotResponse] = useState(0);
const { user, setUser } = useContext(UserContext);
axios
.post(
process.env.REACT_APP_API_URL + '/api/auth/checkauth/',
{ content: 'checkAuthStatus' },
{
headers: { 'Content-Type': 'application/json' },
withCredentials: true,
}
)
.then((res) => {
setUser(res.data.firstName + ' ' + res.data.lastName);
setIsAuthenticated(1);
setGotResponse(1);
})
.catch(function (error) {
setIsAuthenticated(0);
setGotResponse(1);
});
if (gotResponse === 1) {
return (
<Route
{...rest}
render={(props) => {
if (isAuthenticated === 1) {
return <Component {...rest} {...props} />;
} else {
return (
<Redirect
to={{
pathname: '/login',
state: {
from: props.location,
},
}}
/>
);
}
}}
/>
);
} else {
return null;
}
};
export default ProtectedRoute;
大部分路由发生的主要 app.js 文件如下所示;
function App() {
const [user, setUser] = useState();
return (
<main>
<Switch>
<UserContext.Provider value={{ user, setUser }}>
<Route
exact
path="/login"
render={(props) => <Login {...props} />}
></Route>
<ProtectedRoute
exact
path="/account"
component={Account}
title="Account"
></ProtectedRoute>
<ProtectedRoute
exact
path="/staff"
component={Staff}
></ProtectedRoute>
<ProtectedRoute
exact
path="/security"
component={Security}
></ProtectedRoute>
<ProtectedRoute exact path="/" component={Home}></ProtectedRoute>
<Route exact path="/2fa" component={Tfa}></Route>
</UserContext.Provider>
<Route component={NotFound}></Route>
</Switch>
</main>
);
}
export default App;
当应用程序正在运行并且我加载登录页面或任何其他受保护的路由时,我看到对 checkauth API 端点的许多相同请求。 Chrome network tab screenshot
这是因为 React 将我的所有路由加载到一个块中,因此在每次页面加载时为每个路由调用 checkauth 端点?我有点难过。
TIA
【问题讨论】:
-
编辑 - 我认为它必须与每条被渲染的路线有关,因为当你将所有受保护的路线更改为常规路线时,除了“/”主页路线,点击次数checkauth 端点下降到只有 3 + 1 预检。虽然我仍然不清楚为什么仍然有 3 个而不是只有 1 个
-
在主组件中调用你的 checkAuth API。就像在顶级父组件中一样。并将结果存储在本地存储或减速器中(首选 localStorage),然后在受保护的路由中从 localStorage 读取值并使用它进行验证
标签: javascript reactjs react-router