Как автоматически обновить токен JWT в приложении React с NodeJS? - PullRequest
0 голосов
/ 04 мая 2018

В последние несколько дней я пытался написать какое-то , которое проверяет, находится ли токен, хранящийся в , по-прежнему в силе и не достиг даты окончания срока действия. Если он больше недействителен, он должен обновить токен перед выполнением любого другого асинхронного вызова. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что асинхронные функции редукса в компонентах вызываются в первую очередь перед вызовом промежуточного программного обеспечения.

В настоящее время я написал следующее промежуточное ПО:

reduxMiddleware.js

const refreshJwt = ({ dispatch, getState }) => {
  return (next) => (action) => {
    console.log(typeof action);
    if (typeof action === "function") {
      if (getState().authentication.token) {
        // decode jwt so that we know if and when it expires

        var tokenExpiration = parseJwt(getState().authentication.token).exp;

        if (
          tokenExpiration &&
          moment(tokenExpiration) <
            moment(Math.floor(Date.now().valueOf() / 1000))._i
        ) {
          console.log("start refreshing");
          startRefreshToken(getState().authentication.refreshToken).then(
            (token) => {
              console.log("done refreshing");
              dispatch(updateAccessToken(token));
              next(action);
            }
          );
        }
      }
    }
    return next(action);
  };
};

export default refreshJwt;

Я применяю это промежуточное ПО примерно так:

export default () => {
  const store = createStore(
    combineReducers({
      authentication: authenticationReducer,
      venue: venueReducer,
      tables: tableReducer
    }),
    composeEnhancers(applyMiddleware(refreshJwt, thunk))
  );

  return store;
};

Код startRefreshToken:

const startRefreshToken = (refresh_token) => {
  return httpPost(
    process.env.NODE_ENV
      ? `https://tabbs-api.herokuapp.com/api/v1/token`
      : `http://localhost:3000/api/v1/token`,
    {
      refresh_token
    }
  )
    .then((response) => {
      localStorage.setItem(
        "authentication",
        JSON.stringify({
          token: response.data.token,
          refreshToken: refresh_token
        })
      );
      return response.data.token;
    })
    .catch((error) => {
      return Promise.reject(error.response);
    });
};

Порядок звонков:

enter image description here

Легенда:

  • Выполнение вызова теперь означает функцию, вызываемую в компоненте
  • начать обновлять стенды для промежуточного программного обеспечения, которое называется

В настоящее время у меня возникает следующая проблема:

  • Когда асинхронная функция в компонентах didComponentMount вызывается, она вызывается до вызова функции промежуточного программного обеспечения. Это приводит к тому, что он будет использовать старый токен, хранящийся в избыточном / локальном хранилище.

Я действительно не могу найти проблему до сегодняшнего дня и хотел бы получить внешнюю помощь по этой проблеме.

Я знаю, что это дубликат: Как использовать Redux для обновления токена JWT?

Спасибо за помощь. Если вам понадобится дополнительный контекст / код, пожалуйста, не стесняйтесь комментировать. Я добавлю его в коды и коробки.

Лучший Кевин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...