Настройка заголовка авторизации JWT в Interceptor не работает

0

здесь перехватчик. Токен выглядит хорошо для меня, но заголовок все еще пуст, когда я просматриваю заголовок запроса в хром-отладчике.

function httpInterceptor($q, $rootScope, $location, $localStorage) {
    return {
        'request': function(config) {
            if ($localStorage.authToken) {
                config.headers.Authorization = 'Bearer ' + $localStorage.authToken; // SET HEADER HERE!!!
            }
            console.debug('intercepting request to url: ' + config.url);
            return config;
        },
        'response': function(response) {
            console.debug('intercepting response');
            return response;
        },
        'responseError': function(response) {
            console.debug('intercepting response error');
            if (response.status === 401 && $location.path().indexOf('login') == -1) {
                console.debug('authentification required redirecting to login page.');
                response.data = '';
                if ($location.path().indexOf('login') == -1) {
                    $rootScope.preLoginUrl = $location.path();
                }
                $location.path('/login');
                return {};
            } else {
                console.debug(response.config.method + ' on ' + response.config.url + ' failed with status ' + response.status);
            }
            return $q.reject(response);
        }
    };
}

angular.module('hop').service('httpInterceptor', httpInterceptor);

Я не могу понять, что это за проблема... может быть, я слепой :-)

Изображение 174551

  • 0
    Вы добавили его в массив перехватчиков (таким образом, регистрируя его)?
  • 0
    Да. также Chrome отладчик переходит к этому коду ..
Показать ещё 3 комментария
Теги:

1 ответ

0
Лучший ответ

ОК здесь решение...

Как и в моем последнем комментарии, причиной для всех является настройка и характер браузеров, имеющих дело с ним. В моем случае приложение UI работает на другом сервере/домене в качестве служб резервного копирования. Всякий раз, когда пользовательский интерфейс теперь пытается запросить ресурс через REST, браузер неявно выполняет предварительный вызов с помощью метода запроса "ОПЦИИ". Для небезопасных конечных точек это не проблема. Но всякий раз, когда конечная точка ожидает, что заголовок аутентификации будет настроен для авторизации запроса клиентов, это будет терпеть неудачу, поскольку запрос, созданный браузером, выходит за пределы области приложения, и ни один из заголовков не установлен. Чтобы обойти это, вам просто нужно поймать набранные запросы OPTIONS на стороне сервера и дать "OK" обратно в cient.

В моем случае я сделал это в том же классе, где я также включил CORS - только улучшил свой фильтр сервлета в приложении:

  import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CORSFilter implements Filter {
    private static final String OPTIONS = "OPTIONS";

    public void destroy() {
    }

    public static String VALID_METHODS = "DELETE, HEAD, GET, OPTIONS, POST, PUT";

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpResponse.setHeader("Access-Control-Allow-Methods", VALID_METHODS);
        httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, Authorization");
        httpResponse.setHeader("Access-Control-Max-Age", "3600");

        if (OPTIONS.equals(httpRequest.getMethod())) {
            httpResponse.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig config) throws ServletException {
    }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню