@Override
    public Authenticator authenticate(Vertx vertx, Map<String, String> config, MultiMap headerMap, Handler<AsyncResult<Void>> resultHandler) {
        OAuth2ClientOptions credentials = new OAuth2ClientOptions(mapToJson(config));
        if (config.get("oauthUri") != null) {
            credentials.setSite(config.get("oauthUri"));
        }
        if (config.get("clientId") != null) {
            credentials.setClientID(config.get("clientId"));
        }

        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 = OAuth2Auth.create(vertx, flowType, credentials);

        oauth2.getToken(params, tokenResult -> {
          if (tokenResult.succeeded()) {
              log.debug("OAuth2 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;
    }
@author Marc Savy {@literal <marc@rhymewithgravy.com>}
gateway/engine/vertx-polling/src/main/java/io/apiman/gateway/engine/vertx/polling/fetchers/auth/OAuth2.java