Bogopodoben
@Bogopodoben

Как повторно отправить не успешные запросы?

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

Суть проблемы, как собрать эти запросы и отправить повторно с обновленным токеном?

Пример provider:
$httpProvider.interceptors.push(['$q', '$location', 'jwtHelper', 'authServices', '$injector',
      function($q, $location, jwtHelper, authServices, $injector) {
        return {
          request: function(config) {
            var token = localStorage.getItem('auth');
            if(token) {
              config.headers = config.headers || {};
              config.headers.Authorization = 'Bearer ' + token;
            }
            return config;
          },
          requestError: function(rejection) {
            return $q.reject(rejection);
          },
          response: function(response) {
            var storedToken = localStorage.getItem('auth'),
            receivedToken = response.headers('Authorization');
            if(receivedToken && storedToken !== receivedToken) {
              localStorage.setItem('auth', receivedToken);
            };
            return response;
          },
          responseError: function(rejection) {
            switch (rejection.status) {
              case 401:
              receivedToken = rejection.headers('Authorization');
              if (receivedToken) {
                localStorage.setItem('auth', receivedToken);
              };
              console.log(receivedToken);
              break;
              case 403:
              break;
            }
            return $q.reject(rejection);
          }
        };
      }]);
  • Вопрос задан
  • 519 просмотров
Пригласить эксперта
Ответы на вопрос 1
@SuperOleg39ru
Front-end разработчик
Добрый день!

Вкратце, как решал эту проблему:
Отдельный сервис занимается сохранением и обновлением токена, назовем его Session.
В interceptors фазе request вы все делаете верно, это добавляет токен на каждый запрос.

Переходим к фазе responseError:
1) Определяем необходимые тип ошибки
2) Можно ограничить количество повторных запросов, и редиректить на login page (тут свой нюанс, надо обнулять счетчик в фазе response - успешный ответ)
3) Отправляем запрос на обновление токена
4) При успехе, вызываем сервис $http с параметрами этого запроса

Пример кода:
responseError: function(rejection) {
  ...

  if (tokenError) {
    return Session.refreshToken().then(function() {
        return $http(rejection.config); // Повторяем запрос, когда получили новый токен
    });
  }

  return $q.reject(rejection);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы