Перехватчик AngularJS никогда не перехватывает ошибку 401

Я использую Angular v1.2.20 с http://ionicframework.com/. Я видел много статей и постов о том, как обрабатывать ошибки 401 с сервера с помощью перехватчика и помещать его в $httpProvider.interceptors массив.

По какой-то причине 401 ответ никогда не попадется repsonseError функция в моем перехватчике. Обещание, которое я ожидаю отклонить, никогда не отклоняется, и мое приложение просто зависает (loading:hide снизу никогда не вызывается). Из моего прокси-сервера для отладки я вижу, что 401 определенно возвращается с сервера.

Мой перехватчик:

.factory('interceptorService', function($rootScope, $q, Session, AuthorizationHeader) {
  var interceptorService = {
    request: function(config) {
      $rootScope.$broadcast('loading:show');
      config.headers['Authentication-Key'] = Session.key();
      config.headers['Authentication-Timestamp'] = (new Date().toJSON());
      config.headers['Authentication-Account'] = Session.accountName();
      if(typeof config.headers['Authorization'] === 'undefined') {
        config.headers['Authorization'] = 'Custom-HMAC-SHA512 ' + AuthorizationHeader.buildHashed(config, Session.key());
      }
      return config || $q.when(config);
    },

    response: function(response) {
      if(response.status === 401) {
        console.log('401');
      }
      $rootScope.$broadcast('loading:hide');
      return response || $q.when(response);
    },

    requestError: function(config) {
      $rootScope.$broadcast('loading:hide');
      return $q.reject(config);
    },

    responseError: function(response) {
      console.log('response error');
      $rootScope.$broadcast('loading:hide');
      return $q.reject(response);
    }
  };

  return interceptorService;
})

Я могу подтвердить, что перехватчик работает, так как, когда я получаю 403 обратно с сервера, я вижу "ошибку ответа" в моем журнале консоли. Также обратите внимание, что это происходит независимо от используемого HTTP-глагола. Это происходит с вызовами HEAD и DELETE.

Любая помощь очень ценится.

## Редактировать

Похоже, что эта проблема вызвана тем, что Cordova/ PhoneGap не в состоянии справиться с www-authenticate заголовок в ответе 401, как указано в этом сообщении в блоге.

Если у кого-то есть идеи о том, как лучше всего с этим справиться, я весь в ушах.

1 ответ

Решение

Просто удалите заголовок WWW-Authenticate из ответа, прежде чем он вернется в ваше приложение. Вот что исправило это для меня.

обрабатывать 401 несанкционированную ошибку на Windows Phone с PhoneGap

Изменить: Реализация, которая использовалась в моей работе, была сделана на нашем F5 (балансировщик нагрузки), так как именно здесь происходит наша базовая аутентификация.

Вот кое-что, что я взбил, это НЕ было проверено. Вы могли бы поместить это в метод Application_EndRequest в файле Global.asax.cs:

    if (context.Response.Headers.Contains("WWW-Authenticate"))
        context.Response.Headers.Remove("WWW-Authenticate");
Другие вопросы по тегам