Как повторить вызов API после обновления токена JWT?

Привет, я новичок в интерфейсе аутентификации JWT, и мне было интересно, как повторно отправить запрос при выпуске нового токена.

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

Как лучше всего поддерживать этот шаблон? В качестве POC я написал быстрый фрагмент, чтобы продемонстрировать идею, которая у меня была, но чувствую, что может быть лучший способ.

const API_FETCH_ATTEMPTS = 2; 
const refreshAPI = 'backend/refresh';

function customFetch(url, options, retryAttempts = API_FETCH_ATTEMPTS){

  if (!retryAttempts){
    return null 
  }
  const authToken = localStorage.getItem('auth-token');
  return fetch(url, {...options,'AuthToken': authToken})
    .then()// successful call
    .catch(err => {
      if (err.status === '401'){
        fetch(refreshAPI)
          .then(newToken => {
            localStorage.setItem('authToken', newToken)
            customFetch(url, options, retryAttempts - 1);
          });
      }
    });
}

Любые идеи/помощь очень ценятся. Спасибо!


person Eric    schedule 03.11.2020    source источник


Ответы (1)


Вы на верном пути:

  • Ожидайте ошибки 401
  • Обновить токен доступа
  • Повторите вызов API только один раз с новым токеном.
  • Перенаправить пользователя для повторного входа в систему, если обновление токена не удалось

Я предпочитаю использовать 2 класса:

  • Агент службы для вызова API
  • Класс аутентификатора для выполнения работы OAuth.

Вот пример моего кода, хотя вы можете реализовать этот шаблон проектирования на любом клиентском языке:

person Gary Archer    schedule 04.11.2020