Ответ Vertx отправляется до обновления сеанса в кластерном хранилище сеансов - PullRequest
0 голосов
/ 07 апреля 2020

Я сталкиваюсь с ситуацией, когда пользователь получает слишком много ошибок перенаправления после входа в систему с keycloak.

Пример кода:

ClusteredSessionStore clusteredSessionStore = ClusteredSessionStore.create(vertx);
OAuth2Auth keycloakAuthProvider = KeycloakAuth.create(vertx, OAuth2FlowType.AUTH_CODE, keyCloakConfig);
router.route().handler(BodyHandler.create().setUploadsDirectory("/tmp"));
router.route().handler(SessionHandler.create(clusteredSessionStore).setAuthProvider(keycloakAuthProvider));
OAuth2AuthHandler keyCloakOAuthHandler = OAuth2AuthHandler.create(keycloakAuthProvider, homePageUrl);
keyCloakOAuthHandler.setupCallback(router.get("/callback"));
router.route("/").handler(keyCloakOAuthHandler);

Мы используем Zookeeper в качестве нашего менеджера кластера.

После моей отладки я обнаружил, что при выполнении обратного вызова keycloak в классе OAuth2AuthHandlerImpl в методе setupCallback (окончательный маршрутный маршрут), где записывается обработчик обратного вызова, после проверки подлинности и получения токенов пользователь получает перенаправлен на /. Код ниже.

ctx.response()
            // disable all caching
            .putHeader(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate")
            .putHeader("Pragma", "no-cache")
            .putHeader(HttpHeaders.EXPIRES, "0")
            // redirect (when there is no state, redirect to home
            .putHeader(HttpHeaders.LOCATION, state != null ? state : "/")
            .setStatusCode(302)
            .end("Redirecting to " + (state != null ? state : "/") + ".");

Перед отправкой ответа вызывается headersEndHandler. В методе addStoreSessionHandler, в классе SessionHandlerImpl, перед завершением вызова для аннулирования старого идентификатора сеанса и помещения нового идентификатора сеанса в кластер zookeeper asyncMap контекст завершается, и ответ пользователю отправляется вместе с новым сеансом. Когда пользователь перенаправляется в / с новым файлом cookie / сеанс, но выполняется вызов для обновления хранилища, это приводит к бесконечному l oop, и пользователь видит слишком много ошибок перенаправления. Ниже приведен код развертывания:

String zkHosts = System.getProperty("zookeeperHosts", "127.0.0.1");

JsonObject zkConfig = new JsonObject();
zkConfig.put("zookeeperHosts", zkHosts);
zkConfig.put("rootPath", "io.vertx");
zkConfig.put("retry", new JsonObject().put("initialSleepTime", 3000).put("maxTimes", 3));


ClusterManager mgr = new ZookeeperClusterManagerNew(zkConfig);
VertxOptions vertxOptions = new VertxOptions().setClusterManager(mgr);
String vertxWorkers = System.getProperty("vertxWorkerPoolSize", "20");
vertxOptions.setWorkerPoolSize(Integer.valueOf(vertxWorkers));
vertxOptions.getEventBusOptions().setClustered(true).setClusterPublicHost("127.0.0.1");

Vertx.clusteredVertx(vertxOptions, event -> {
  if (event.succeeded()) {
    event.result().deployVerticle(new ABCVerticle(), new DeploymentOptions());
  } else {
  }
});

Не могли бы вы помочь, если я что-то делаю неправильно или это ошибка в Vertx.

Примечание: я использую vertx 3.8.4 и zookeeper 3.6 .0.

Заранее спасибо.

...