Перехватчик 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");