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?