diff --git a/proxy/proxy-server/src/main/java/org/keycloak/proxy/ProxyServerBuilder.java b/proxy/proxy-server/src/main/java/org/keycloak/proxy/ProxyServerBuilder.java index 1dd96c6bf2..5c3dbc7fc6 100755 --- a/proxy/proxy-server/src/main/java/org/keycloak/proxy/ProxyServerBuilder.java +++ b/proxy/proxy-server/src/main/java/org/keycloak/proxy/ProxyServerBuilder.java @@ -240,8 +240,7 @@ public class ProxyServerBuilder { } private HttpHandler addSecurity(final HttpHandler toWrap) { - HttpHandler handler = toWrap; - handler = new UndertowAuthenticatedActionsHandler(deploymentContext, toWrap); + HttpHandler handler = new UndertowAuthenticatedActionsHandler(deploymentContext, toWrap); if (errorPage != null) { if (base.endsWith("/")) { errorPage = base + errorPage; @@ -249,6 +248,7 @@ public class ProxyServerBuilder { errorPage = base + "/" + errorPage; } } + handler = new TokenRequestPreHandler(handler); handler = new ConstraintAuthorizationHandler(handler, errorPage, sendAccessToken, headerNameConfig); handler = new ProxyAuthenticationCallHandler(handler); handler = new ConstraintMatcherHandler(matches, handler, toWrap, errorPage); diff --git a/proxy/proxy-server/src/main/java/org/keycloak/proxy/TokenRequestPreHandler.java b/proxy/proxy-server/src/main/java/org/keycloak/proxy/TokenRequestPreHandler.java new file mode 100644 index 0000000000..312bd20023 --- /dev/null +++ b/proxy/proxy-server/src/main/java/org/keycloak/proxy/TokenRequestPreHandler.java @@ -0,0 +1,27 @@ +package org.keycloak.proxy; + +import io.undertow.server.HttpHandler; +import io.undertow.server.HttpServerExchange; +import org.keycloak.constants.AdapterConstants; + +/** + * Dispatches requests for k_query_bearer_token through a worker thread (handler for this + * resource performs blocking IO). + */ +public class TokenRequestPreHandler implements HttpHandler { + + private final HttpHandler next; + + public TokenRequestPreHandler(HttpHandler next) { + this.next = next; + } + + @Override + public void handleRequest(HttpServerExchange exchange) throws Exception { + if (exchange.getRequestURI().endsWith(AdapterConstants.K_QUERY_BEARER_TOKEN)) { + exchange.dispatch(next); + } else { + next.handleRequest(exchange); + } + } +}