CORSFilter is not applied on JAX-RS Application

Viewed 2093

I am using resteasy-jaxrs - 3.0.9.FINAL. I have two separate javax.ws.rs.core.Applications

@ApplicationPath("oauth")
public class OAuthApplication extends Application {
    final Set<Class<?>> classes = new HashSet<>();

    @Nonnull
    @Override
    public Set<Class<?>> getClasses() {
        classes.add(RegisterResource.class);
        classes.add(TokenResource.class);
        classes.add(HelloResource.class);
        return Collections.unmodifiableSet(classes);
    }
}

for /oauth based endpoints and

@ApplicationPath("rest")
public class RestApplication extends Application {
    final Set<Class<?>> classes = new HashSet<>();

    @Nonnull
    @Override
    public Set<Class<?>> getClasses() {
        classes.add(CategoryResource.class);
        classes.add(CategoryGroupResource.class);
        classes.add(TransactionResource.class);
        classes.add(MonthlySummaryResource.class);
        classes.add(MemberResource.class);
        return Collections.unmodifiableSet(classes);
    }
}

My filter looks like

@Provider
public class CorsFeature implements Feature {

  @Override
  public boolean configure(FeatureContext featureContext) {
    CorsFilter corsFilter = new CorsFilter();
    corsFilter.getAllowedOrigins().add("*");
    corsFilter.setAllowedMethods("OPTIONS, GET, POST, DELETE, PUT, PATCH");
    featureContext.register(corsFilter);
    return true;
  }
}

I also apply filter on my /rest/* resources which looks like

@WebFilter("/rest/*")
public class AuthTokenValidatorFilter implements Filter {
    private static final String BEARER_HEADER = "BEARER";
    private static final String COLON = ":";
    private static final Pattern PATTERN = Pattern.compile(COLON);

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

    @Override
    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
        final HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        final HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;

        if (httpRequest.getHeader(BEARER_HEADER) == null || !isValidAuthToken(httpRequest.getHeader(BEARER_HEADER))) {
            httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
            return;
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    private static boolean isValidAuthToken(@Nonnull final String header) {
        final String[] tokenParts = PATTERN.split(header);
        if (tokenParts.length != 3) {
            // hash, uuid, timestamp
            return false;
        }

        final int nanoTimeStamp;
        try {
            nanoTimeStamp = Integer.parseInt(tokenParts[2]);
        } catch (final NumberFormatException e) {
            return false;
        }

        final String hashedAuthToken = new UniqueIdGenerator().getHashedAuthToken(tokenParts[1], nanoTimeStamp);
        return hashedAuthToken.equals(tokenParts[0]);
    }

    @Override
    public void destroy() {
    }
}

When I start the application and hit the endpoint, I see

 ~ curl -v http://localhost:9090/application/oauth/hello
*   Trying ::1...
* Connected to localhost (::1) port 9090 (#0)
> GET /application/oauth/hello HTTP/1.1
> Host: localhost:9090
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow 1
< Server: Wildfly 8
< Content-Type: application/octet-stream
< Content-Length: 5
< Date: Fri, 26 May 2017 19:05:15 GMT
<
* Connection #0 to host localhost left intact
hello%

I do not see the CORS Headers sent back. What am I missing here?

2 Answers
Related