Мой перехватчик токена аутентификации не перехватывает запрос / ответ нового маршрута

Я пытаюсь реализовать аутентификацию jwt для своих приложений nodejs, express и angularjs. Пока что я сгенерировал токен и сохранил его в моем localStorage. Согласно этому руководству, Я реализовал authInterceptor в angular factory следующим образом:

app.factory('authInterceptor', function ($rootScope, $q, $window) {
  return {
    request: function (config) {
      config.headers = config.headers || {};
      if ($window.localStorage.myToken) {
        config.headers.Authorization = 'Bearer ' + $window.localStorage.myToken;

      }
      return config;
    },
    response: function (response) {
      if (response.status === "401") {
        $window.location.replace('/dash');
      }
      return response || $q.when(response);
    }
  };
});

Я вставил перехватчик в файл конфигурации следующим образом:

$httpProvider.interceptors.push('authInterceptor');

Пока я отправил учетные данные на сервер, сгенерировал токен и сохранил его в localStorage.

Поэтому до тех пор, пока я не удалил токен из localStorage и срок действия токена не истек, я думаю, он должен сохраняться. Если я делаю запросы из загруженной страницы, используя фоновый вызов ajax angularjs, заголовок аутентификации устанавливается так, как должен.

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYSIsInR5cGUiOiJzYWxlcyIsImlhdCI6MTQyMjI2MDExMCwiZXhwIjoxNDIyMjc4MTEwfQ.Iv6W-Tc8Qm4FGclzmgbtjvWFz_tyDwEvrFmMmucONpY

Однако ни мой запрос, ни мой ответ не перехватываются, когда я перехожу на новый маршрут. Например, у меня есть маршрут «/ продажи». Но когда я перехожу к маршруту продаж из адресной строки, ни один из заголовков аутентификации запроса не устанавливается перехватчиком, тем самым возвращая с сервера ошибку авторизации 401, которая также не перехватывается; следовательно, не перенаправляем на /dash.

Вот ссылка на ошибку и заголовки запроса GET на неавторизованный маршрут '/ sales': заголовок запроса и ответа на  Ошибка 401


person Pravin    schedule 26.01.2015    source источник
comment
Подсказка: вы когда-нибудь смотрели на responseError?   -  person Blackunknown    schedule 26.01.2015
comment
Мои извинения, я должен был быть яснее. В смысле: responseError: function (rejection) {if (rejection.status == 401) {// что-то делаем с путем}}   -  person Blackunknown    schedule 26.01.2015
comment
это должно быть внутри перехватчика или внутри контроллера?   -  person Pravin    schedule 26.01.2015
comment
Он является частью перехватчика, точно так же, как ответ и запрос. Я использую responseError, чтобы определить, был ли мой статус 401, а затем перенаправляю пользователя на страницу входа в моем случае.   -  person Blackunknown    schedule 26.01.2015
comment
Неа. каким-то образом перехватчик не перехватывает ни запрос, ни ответ. Не знаю почему.   -  person Pravin    schedule 26.01.2015


Ответы (2)


Ваш бэкэнд отправляет заголовок WWW-Authenticate вместе со статусом 401? Если это так, и он содержит Basic, браузер поймает ответ и покажет всплывающее окно с учетными данными, прежде чем Angular сможет его поймать.

Попробуйте либо удалить, либо изменить его.

Использованная литература:

person vzsg    schedule 03.02.2015
comment
спасибо ... в этом есть смысл ... но попытка реализовать ... ты дал мне хоть какое-то преимущество ... - person Pravin; 03.02.2015
comment
Я не смог обработать заголовок www-Authenticate. Я использую jsonwebtoken для создания токена, express-jwt для перехвата заголовка авторизации на сервере и, как описано, angular Interceptor для перехвата ответа на стороне клиента. - person Pravin; 04.02.2015

То, что я понял до сих пор, обычно до фреймворков интерфейса javascript, как выполнялся HTTP-запрос:

  • Набираем URL-адрес в адресной строке.
  • Браузер отправляет запрос.
  • Сервер получает запрос.
  • обслуживает необходимые файлы html, js и css.
  • браузер отображает это.

Но поскольку начался недавний переход на различные интерфейсы javascript и использование RESTful api.s, запрос должен иметь заголовок авторизации. Таким образом, во многих одностраничных веб-приложениях с фреймворками JavaScript, такими как angularjs,

  • отправляется первоначальный запрос на роутер '/'
  • сервер обслуживает веб-приложение в браузере
  • вся дальнейшая маршрутизация в веб-приложении выполняется во внешнем приложении, поэтому после URL-адреса стоит знак «#».
  • Приложение делает запросы на выборку, обновление, удаление или публикацию из приложения через angular js.

Поэтому, когда запрос сделан из приложения angular, он перехватывается из приложения angular и перехватывается вашим перехватчиком. Однако, когда URL-адрес вводится из адресной строки, браузер отправляет запрос непосредственно на сервер, потому что в этот момент запроса браузер не загрузил веб-приложение angular.

Я сделал то, что вы установили для html5mode значение false и поставили # перед маршрутом.

например localhost/#/some-route, и сделайте маршрутизацию от вашего провайдера маршрутов. Когда перед маршрутом стоит #, запрос на / отправляется на сервер, приложение загружается, а затем запрос отправляется через приложение. Теперь из этого some-route заставьте какой-нибудь контроллер запросить желаемую конечную точку сервера, которая будет перехвачена перехватчиком.

person Pravin    schedule 02.07.2015
comment
Кажется, у меня проблема, очень похожая на эту stackoverflow.com/questions/36481206/ - person gh0st; 08.04.2016