@Override
    public Authenticator authenticate(Vertx vertx, Map<String, String> config, MultiMap headerMap, Handler<AsyncResult<Void>> resultHandler) {

        OAuth2FlowType flowType = getFlowType(config.get("flowType"));
        JsonObject params = new JsonObject();
        if (config.get("username") != null) {
            params.put("username", config.get("username"));
        }
        if (config.get("password") != null) {
            params.put("password", config.get("password"));
        }

        OAuth2Auth oauth2 = KeycloakAuth.create(vertx,  flowType, mapToJson(config));

        oauth2.getToken(params, tokenResult -> {
            if (tokenResult.succeeded()) {
                log.debug("OAuth2 Keycloak exchange succeeded.");
                AccessToken token = tokenResult.result();
                headerMap.set("Authorization", "Bearer " + token.principal().getString("access_token"));
                resultHandler.handle(Future.succeededFuture());
            } else {
                log.error("Access Token Error: {0}.", tokenResult.cause().getMessage());
                resultHandler.handle(Future.failedFuture(tokenResult.cause()));
            }
          });
        return this;
    }
Authenticator for Keycloak OAuth2.

<ul>
  <li>flowType: OAuth2 flow type</li>
  <li>username: if password flow</li>
  <li>password: if password flow</li>
</ul>

Paste JSON config from your Keycloak realm.

@see OAuth2FlowType
@author Marc Savy {@literal <marc@rhymewithgravy.com>}
gateway/engine/vertx-polling/src/main/java/io/apiman/gateway/engine/vertx/polling/fetchers/auth/KeycloakOAuth2.java