【问题标题】:Authorization header in Angular 2 using service JAX-RSAngular 2 中使用服务 JAX-RS 的授权标头
【发布时间】:2018-11-07 10:04:10
【问题描述】:

我正在使用 angular 5 作为前端,使用 jersey 作为后端的 java 来制作 um 应用程序。当我尝试从前端角度消费时,我遇到了身份验证问题。这是客户端应用程序的代码:

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
连接:保持活动状态
编译指示:无缓存
缓存控制:无缓存
访问控制请求方法:GET
来源:http://localhost:4200
用户代理:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
访问控制请求标头:授权、内容类型
接受:*/*
接受编码:gzip,放气
接受语言: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;
    }

【问题讨论】:

    标签: java angular authentication oauth jax-rs


    【解决方案1】:

    这不是实际请求,而是CORS Preflight。您可以通过请求中包含以下标头来判断:

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

    这些标头询问服务器是否允许请求。服务器应该相应地使用响应标头进行响应,以告诉浏览器该请求是允许的。如果预检正常,则发出真正的请求。

    有关完整说明以及如何使用 JAX-RS 过滤器解决此问题,请查看 this post

    【讨论】:

      【解决方案2】:

      我不认为这是更好的解决方案,但工作方式如下:

      我在服务器端创建了一个新类来验证请求:

      @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 {
      }
      
      }
      

      这种方法奏效了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-15
        • 2012-07-27
        • 2014-08-08
        • 2017-07-07
        • 1970-01-01
        • 2011-07-04
        • 2015-01-22
        • 1970-01-01
        相关资源
        最近更新 更多