web-dev-qa-db-ja.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);
}

だから私の質問は、トークンがミドルウェアから期限切れになった場合、トークンの有効期限ロジックとログアウトユーザーをどのように使用するのですか?

14
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でラップする必要があります

27
Tushant

MainコンポーネントをHOCでラップする必要があります。 HOCはトークンを検証し、OKの場合、コンポーネントの表示を許可します。トークンが無効な場合、ログインページはリダイレクトされます。

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