Заголовок авторизации в Angular 2 с использованием сервиса JAX-RS - PullRequest
0 голосов
/ 28 мая 2018

Я делаю гм приложение, используя угловой 5 в качестве переднего конца и Ява с Джерси в качестве заднего конца.У меня проблема с аутентификацией, когда я пытаюсь потреблять с моего внешнего интерфейса.Это код клиентского приложения angular:

const headers = {
  'Content-Type': 'application/json',
  'Authorization': this.auth.token
};

return this.http.get(this.url, { headers: headers, withCredentials: true })
  .toPromise()
  .then(this.extractData)
  .catch(this.handleErrorPromise);

Но, глядя на сгенерированный запрос, я не нашел заголовка «авторизация» на моем сервере.Там я получаю только:

хост: 100.0.66.160: 8092
соединение: keep-alive
прагма: no-cache
контроль кэша: no-cache
access-control-request-method: GET
origin: http://localhost:4200
user-agent: Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 66.0.3359.181Safari / 537.36
заголовки запроса-контроля доступа: авторизация, тип контента
принять: * / *
принять кодирование: gzip, deflate
принять язык: pt-BR, pt;q = 0,9, en-US; q = 0,8, en; q = 0,7

Тогда я не нахожу "авторизацию" для проверки, кто-то может сказать мне, что там не так?

Выполнить код проверки на стороне сервера:

String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
    Autenticador autenticacao = new Autenticador();
    String token;

    extrairHeader(requestContext);

    if (authorizationHeader != null && authorizationHeader.contains("Bearer ")) {
        token = authorizationHeader.substring("Bearer ".length()).trim();
        Key key = new KeyGenerator().generateKey();

        return autenticacao.tokenValido(token, key);
    } else {
        return false;
    }

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Нет, если это лучшее решение, но работало так:

Я создал новый класс на стороне сервера для проверки запроса:

@Provider
@Priority(Priorities.HEADER_DECORATOR)
@WebFilter(filterName = "AddHeaderFilter", urlPatterns = {"/*"})
public class CORSFilter implements Filter {

@Override
public void destroy() {
    // TODO Auto-generated method stub
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) servletRequest;

    HttpServletResponse resp = (HttpServletResponse) servletResponse;
    resp.addHeader("Access-Control-Allow-Origin", "*");
    resp.addHeader("Access-Control-Allow-Methods", "GET,POST");
    resp.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");

    // Just ACCEPT and REPLY OK if OPTIONS
    if (request.getMethod().equals("OPTIONS")) {
        resp.setStatus(HttpServletResponse.SC_OK);
        return;
    }
    chain.doFilter(request, servletResponse);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}

Таким образом, сработало.

0 голосов
/ 28 мая 2018

Это не фактический запрос, это CORS Preflight .Вы можете сказать из-за следующих заголовков, включенных в запрос:

  • origin
  • access-control-request-method
  • access-control-request-headers

Эти заголовки спрашивают сервер, разрешен ли запрос.Сервер должен отвечать заголовками ответа, чтобы сообщить браузеру, что запрос разрешен.Если предварительная проверка в порядке, то выполняется реальный запрос.

Для полного объяснения и того, как вы решаете это с помощью фильтра JAX-RS, посмотрите на этот пост .

...