Reactjs 因此,它可以工作,但很容易被欺骗。除非我遗漏了什么?json web令牌就是这样工作的,对于您发出的每一个请求,您都会将头中的令牌发送到API,API会再次验证令牌。因此,即使有人修改了令牌,他们也无法访问不应该访问的内容。你可以检查大多数网站的本地存储,
Reactjs 因此,它可以工作,但很容易被欺骗。除非我遗漏了什么?json web令牌就是这样工作的,对于您发出的每一个请求,您都会将头中的令牌发送到API,API会再次验证令牌。因此,即使有人修改了令牌,他们也无法访问不应该访问的内容。你可以检查大多数网站的本地存储,,reactjs,react-router,Reactjs,React Router,因此,它可以工作,但很容易被欺骗。除非我遗漏了什么?json web令牌就是这样工作的,对于您发出的每一个请求,您都会将头中的令牌发送到API,API会再次验证令牌。因此,即使有人修改了令牌,他们也无法访问不应该访问的内容。你可以检查大多数网站的本地存储,他们也这样存储。此外,在redux的早期,任何使用redux开发工具的人都可以完全看到该商店。我已经实现了您的代码,但当我尝试进入管理员/仪表板时,即使在登录并确认令牌在本地存储中,它仍会将我发送回登录页面…@user8463989您的Auth
因此,它可以工作,但很容易被欺骗。除非我遗漏了什么?json web令牌就是这样工作的,对于您发出的每一个请求,您都会将头中的令牌发送到API,API会再次验证令牌。因此,即使有人修改了令牌,他们也无法访问不应该访问的内容。你可以检查大多数网站的本地存储,他们也这样存储。此外,在redux的早期,任何使用redux开发工具的人都可以完全看到该商店。我已经实现了您的代码,但当我尝试进入管理员/仪表板时,即使在登录并确认令牌在本地存储中,它仍会将我发送回登录页面…@user8463989您的
AuthContext.Provider
如何计算它提供的值?当您进行身份验证/登录时,如何更新上下文值?下面是我在回答一个类似的身份验证问题时创建的。我要注意上下文状态和值提供了一个回调来更新该状态。如果您使用的是localstorage,那么您可能需要正确地“侦听”应用程序何时更新它[localstorage],以便上下文值可以更新。很抱歉,响应延迟。我已经更新了我的问题并添加了Auth钩子。希望能有帮助?谢谢你的帮助。我已经实现了您的代码,但当我尝试进入管理员/仪表板时,即使在登录并确认令牌在本地存储中,它仍会将我发送回登录页面…@user8463989您的AuthContext.Provider
如何计算它提供的值?当您进行身份验证/登录时,如何更新上下文值?下面是我在回答一个类似的身份验证问题时创建的。我要注意上下文状态和值提供了一个回调来更新该状态。如果您使用的是localstorage,那么您可能需要正确地“侦听”应用程序何时更新它[localstorage],以便上下文值可以更新。很抱歉,响应延迟。我已经更新了我的问题并添加了Auth钩子。希望能有帮助?
import { createContext } from "react";
export const AuthContext = createContext({
isLoggedIn: false,
userId: null,
token: null,
login: () => {},
logout: () => {},
});
<AuthContext.Provider
value={{
isLoggedIn: !!token,
token: token,
userId: userId,
login: login,
}}
>
<Router>
// Routes here
</Router>
</AuthContext.Provider>
import { useState, useCallback, useEffect } from "react";
export const useAuth = () => {
const [token, setToken] = useState(false);
const [userId, setUserId] = useState(false);
const login = useCallback((userId, token) => {
setToken(token);
setUserId(userId);
localStorage.setItem(
"userData",
JSON.stringify({
userId: userId,
token: token,
})
);
}, []);
useEffect(() => {
const storedData = JSON.parse(localStorage.getItem("userData"));
if (storedData && storedData.token) {
login(storedData.userId, storedData.token);
}
}, [login]);
return { token, login, userId };
};
console.log(auth.token);
import React, { useContext } from "react";
import { Route, Redirect } from "react-router-dom";
import { AuthContext } from "../shared/context/auth-context";
const ProtectedRoute = ({ path, component: Component, render, ...rest }) => {
const auth = useContext(AuthContext);
console.log(auth.token);
return (
<Route
{...rest}
render={(props) => {
if (!auth.token)
return (
<Redirect
to={{
pathname: "/admin/login",
state: { from: props.location },
}}
/>
);
return Component ? <Component {...props} /> : render(props);
}}
/>
);
};
export default ProtectedRoute;
import React, { useContext } from "react";
import { Route, Redirect } from "react-router-dom";
import { AuthContext } from "../shared/context/auth-context";
const ProtectedRoute = props => {
const auth = useContext(AuthContext);
console.log(auth.token);
return auth.token ? (
<Route {...props} />
) : (
<Redirect
to={{
pathname: '/admin/login',
state: { from: props.location },
}}
/>
);
};
export default ProtectedRoute;