私は現在、httpエンドポイントとKeycloakでイベントバスを保護しようとする単純なプロトタイプVert.x 3.3アプリケーション(Jitpack.ioを使用した最新のGithubビルド)を作成しています。Vert.x 3.3のイベントバスブリッジをKeycloakで保護する方法
私は2つの垂直と静的なインデックスのページには、メッセージを送信するボタンがあります。すべて安全に動作しますが、SockJSイベントバスブリッジをKeycloakで保護する方法はわかりません。 httpエンドポイントのセキュリティがうまくいきます。
Vert.x 3.3は公式にリリースされていないので、私は非常に多くの情報を見つけることができませんでした。 http://vertx.io/blog/vertx-3-and-keycloak-tutorial/は、HTTPエンドポイントと私はKeycloakで動作するように修正するかどうかはわかりませんどのBasicAuthHandlerを使用してのために特別に許可をされる必要の3.21ドキュメントを確保カバー: 現在http://vertx.io/docs/vertx-web/java/#_requiring_authorisation_for_messages
I次のコードを持っている:
public class VertxEventBusTest extends AbstractVerticle {
@Override
public void start(Future<Void> startFuture) throws Exception {
System.out.println("Primary Verticle Started");
Router router = Router.router(vertx);
HttpServer server = vertx.createHttpServer().requestHandler(router::accept);
OAuth2Auth oAuth2Auth = OAuth2Auth.createKeycloak(vertx, OAuth2FlowType.AUTH_CODE, getKeycloakJson());
OAuth2AuthHandler oAuth2AuthHandler = OAuth2AuthHandler.create(oAuth2Auth, "http://localhost:8091");
oAuth2AuthHandler.setupCallback(router.get("/callback"));
SockJSHandlerOptions options = new SockJSHandlerOptions().setHeartbeatInterval(2000);
BridgeOptions bridgeOptions = new BridgeOptions();
bridgeOptions.addInboundPermitted(new PermittedOptions().setAddress("click"));
bridgeOptions.addOutboundPermitted(new PermittedOptions().setAddress("click"));
SockJSHandler sockJSHandler = SockJSHandler.create(vertx, options).bridge(bridgeOptions);
router.route("/").handler(oAuth2AuthHandler);
router.route("/eventbus/*").handler(oAuth2AuthHandler);
router.route("/eventbus/*").handler(sockJSHandler);
vertx.eventBus().<JsonObject>consumer("click", msg -> System.out.println("Msg Received on Verticle1: " + msg.body()));
router.route().handler(StaticHandler.create().setWebRoot("webroot"));
server.listen(8091, result -> {
if (result.succeeded()) {
startFuture.complete();
} else {
startFuture.fail(result.cause());
}
});
}
private JsonObject getKeycloakJson() {
return new JsonObject("{\n" +
" \"realm\": \"Prototype\",\n" +
" \"realm-public-key\": \"<public key>",\n" +
" \"auth-server-url\": \"http://localhost:8180/auth\",\n" +
" \"ssl-required\": \"external\",\n" +
" \"resource\": \"prototype-eventbus\",\n" +
" \"credentials\": {\n" +
" \"secret\": \"<secret>\"\n" +
" }\n" +
"}");
}
}
私の静的なHTMLは次のとおりです。
<head>
<meta charset="UTF-8">
<script src='sockjs-0.3.4.js'></script>
<script src='vertx-eventbus.js'></script>
<script src='index-js.js'></script>
<title>VERT.X Test</title>
</head>
<body onload="load()">
<!-- JavaScript includes. -->
<button onclick="zclicker()">Test Click</button>
</body>
</html>
Javascriptを:
var eb = new EventBus('http://localhost:8091/eventbus');
function load() {
eb.onopen = function() {
eb.registerHandler('click', function (data) {})
};
}
function zclicker() {
eb.publish('click', {
'clicked': true
});
}
垂直を実行している場合は、エラーが、Chromeデベロッパーツール何が存在しないがkeycloakてログイン後、次のエラーを示しています
私はこのケースであるため、指定されたアドレスは、のインスタンス化によって照会されていることをやって行くだろうかCORSに精通したがわかりませんイベントバス。これは、HTTPエンドポイントの場合にリダイレクトを正しく処理したため、Keycloak OAuthハンドラがイベントバスで正しく動作しないという症状です。 –
CORSハンドラを追加しましたが、問題は解決しませんでした。http://vertx.io/docs/vertx-web/java/#_cors_handling –
十分な価値があります。おそらく、3.3がリリースされるまで待つことをお勧めします。 – Will