小编典典

我如何检查令牌到期和注销用户?

reactjs

用户单击注销按钮时可以注销自己,但如果令牌已过期,则他/她将无法注销,因为在我的应用程序中,服务器端和前端都使用了令牌。当用户单击注销按钮时,如果令牌有效,则会清除来自服务器和浏览器的令牌。当用户未注销并且其令牌过期但未在浏览器中清除时,很有可能会出现。为了解决这种情况,我如何在用户每次访问我的应用程序时检查令牌是否到期,因此,如果令牌已过期,请从浏览器中清除令牌?

我尝试过在saga中进行尝试,每次用户刷新页面或切换到另一页面时,它都会在后台监视。我认为这不是一种有效的方法。我认为中间件正在发挥作用。

function* loadInitialActions() {
  var dateNow = new Date();
  console.log(jwtDecode(token).exp < dateNow.getTime() - jwtDecode(token).iat);
  const token =
    JSON.parse(localStorage.getItem("user")) &&
    JSON.parse(localStorage.getItem("user"))["token"];
  if (
    token &&
    jwtDecode(token).exp < dateNow.getTime() - jwtDecode(token).iat
  ) {
    yield put(LOGOUT_SUCCESS);
  }
}

function* initialize() {
  const watcher = yield fork(loadInitialActions);
  yield take([INITIALIZE_ERROR, INITIALIZE_SUCCESS]);
  yield cancel(watcher);
}

function* rootSaga() {
  console.log("rootSaga");
  yield takeLatest(INITIALIZE, initialize);
}

所以我的问题是,如果令牌从中间件过期,我该如何使用令牌到期逻辑和注销用户?


阅读 415

收藏
2020-07-22

共1个答案

小编典典

在我看来,中间件将是最佳选择。

你可以做这样的事情

const checkTokenExpirationMiddleware = store => next => action => {
  const token =
    JSON.parse(localStorage.getItem("user")) &&
    JSON.parse(localStorage.getItem("user"))["token"];
  if (jwtDecode(token).exp < Date.now() / 1000) {
    next(action);
    localStorage.clear();
  }
  next(action);
};

然后您必须将其包装 applyMiddleware

2020-07-22