【发布时间】:2022-01-08 18:28:47
【问题描述】:
JWT accessToken过期后如何注销用户?
现在我使用withRouter 作为高阶组件(HOC)来检查路由变化,但它仅在用户单击浏览器的后退按钮时才有效。
我想在每次路线更改时检查路线更改,而不仅仅是返回按钮。例如,当用户点击返回主页链接时,我想检查令牌是否已过期,然后从本地存储中删除令牌。
AuthVerify.js
import React, { useEffect } from "react";
import { withRouter } from "react-router-dom";
const parseJwt = (token) => {
try {
return JSON.parse(atob(token.split(".")[1]));
} catch (e) {
return null;
}
};
const AuthVerify = (props) => {
console.log(props);
useEffect(() => {
props.history.listen(() => {
const token = localStorage.getItem("accessToken");
if (token) {
const decodedJWT = parseJwt(token);
if (decodedJWT.exp * 1000 < Date.now()) {
console.log("expired");
props.logOut();
} else {
}
}
});
}, []);
return <div></div>;
};
export default withRouter(AuthVerify);
App.js 的一部分
import { Fragment } from "react";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import AuthVerify from "../src/utils/AuthVerify";
import "./App.css";
import Home from "./pages/Home";
import Signup from "../src/pages/Signup";
import Login from "../src/pages/Login";
import Test from "./pages/Test";
const logOut = () => {
localStorage.removeItem("accessToken");
localStorage.removeItem("refreshToken");
};
function App() {
return (
<Fragment>
<div className="App">
<BrowserRouter>
<Switch>
<Route exact path="/" component={Home} />
<PrivateRoute exact path="/test" component={Test} />
<Route exact path="/register" component={Signup} />
<Route exact path="/login" component={Login} />
</Switch>
</BrowserRouter>
</div>
<AuthVerify logOut={logOut} />
</Fragment>
);
}
export default App;
【问题讨论】:
标签: reactjs react-router react-router-dom