it-roy-ru.com

Как проверить срок действия токена и выйти из системы?

Пользователь может выйти из системы сам, когда он/она нажимает на кнопку выхода из системы, но если срок действия токена истек, он/она не может выйти из системы, потому что в моем приложении токен используется как на стороне сервера, так и во внешнем интерфейсе. Когда пользователь нажимает кнопку выхода, токен как с сервера, так и из браузера очищается, если токен действителен. Существует вероятность того, что когда пользователь не выйдет из системы, и его/ее токен истечет, но не будет очищен в браузере. Для решения этой проблемы, как я могу проверять срок действия токена каждый раз, когда пользователь посещает мое приложение, поэтому, если токен истек, удалите токен из браузера? 

Я пробовал в саге, которая смотрит в фоновом режиме каждый раз, когда пользователь обновляет страницу или переключается на другую страницу. Я не думаю, что это эффективный способ. Я считаю, что промежуточное ПО вступает в игру.

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);
}

Итак, мой вопрос: как мне использовать логику истечения срока действия токена и выйти из системы, если срок действия токена истек из промежуточного программного обеспечения?

9
Serenity

На мой взгляд, промежуточное ПО будет лучшим вариантом.

Вы можете сделать что-то вроде этого 

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

22
Tushant

Вам нужно обернуть основной компонент HOC. HOC проверит токен и, если ОК, разрешит отображение компонента. Если токен недействителен, страница входа будет перенаправлена ​​на. 

const authChecker = (Component) => {
  return class extends React.Component {
    state = {
      show: false;
    }

    componentWillReceiveProps(nextProps) {
      if (nextProps.children !== this.props.children) {
        this.checkAuth();
      }
    }

    componentDidMount() {
      this.checkAuth();
    }

    checkAuth() {
      Api.checkAuth()
      .then(result => {
        if (result.success) {
          this.setState({ show: true });
        } else {
          // logout since token expired
          API.logout();
        }
      });
    }

    render() {
      return this.state.show && <Component {...this.props} />
    }
  }
}

export default authChecker(Main);
2
vijayst

this.serverResponse.expires_in - время истечения в секундах.

var tokenexpiration: Date = new Date();
tokenexpiration.setSeconds(new Date().getSeconds() + parseInt(this.serverResponse.expires_in))
console.log(tokenexpiration);

чем вы можете сохранить его в localStorage:

localStorage.setItem('expirationdate',tokenexpiration)

и с простым условием вы можете проверить всякий раз, когда токен истек.

0
jonathana