Я создаю веб-приложение AngularJS (1.2.16) с API RESTful, и я бы хотел отправить 401 Несанкционированные ответы на запросы, в которых данные аутентификации являются недействительными или нет. Когда я это делаю, даже с присутствующим HTTP-перехватчиком, я вижу представленный браузером базовый диалог "Требуется проверка подлинности", когда запрос AJAX выполняется через AngularJS. Мой перехватчик запускается после этого диалога, что слишком поздно, чтобы сделать что-то полезное.
Конкретный пример:
My backend API возвращает 401 для /api/things
, если нет токена авторизации. Приятно и просто.
На стороне приложения AngularJS я просмотрел docs и настроил такой перехватчик в блоке config
$httpProvider.interceptors.push(['$q', function ($q) {
return {
'responseError': function (rejection) {
if (rejection.status === 401) {
console.log('Got a 401')
}
return $q.reject(rejection)
}
}
}])
Когда я загружаю свое приложение, удаляю токен аутентификации и выполняю вызов AJAX /api/things
(чтобы, надеюсь, запустить вышеупомянутый перехватчик), я вижу следующее:
Если я отменил это диалоговое окно, я вижу вывод console.log
"Got a 401", который я надеялся увидеть вместо этого диалога:
Ясно, что перехватчик работает, но перехватывает слишком поздно!
Я вижу многочисленные сообщения в Интернете об аутентификации с помощью AngularJS в ситуациях, подобных этому, и все они, похоже, используют HTTP-перехватчики, но ни один из них не упоминает об открытии основного диалога auth. Некоторые ошибочные мысли, которые я имел для его появления, включали:
- Отсутствует заголовок
Content-Type: application/json
в ответе? Нет, это там. - Нужно вернуть что-то другое, кроме обещания отклонения? Этот код всегда запускается после диалога, независимо от того, что возвращается.
Я пропустил какой-то шаг установки или неправильно использовал перехватчик?