2016-05-04 18 views
3

私は現在、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てログイン後、次のエラーを示しています

​​

答えて

1

CORS問題のように見えること。あなたは、セキュリティを気にどれだけ依存

Access-Control-Allow-Origin: * 

または

Access-Control-Allow-Origin: http://localhost:8091 

:あなただけの応答に次のヘッダを追加することができるかもしれないあなたのエラーのルックスによって

これは通常、text/htmlの単純なGETには十分ですが、他のコンテンツタイプ(JSONなど)やPUT/DELETEメソッドを処理したい場合は、ヘッダーを追加する必要があります。

一部のリソース:

http://enable-cors.org/server.html

http://www.html5rocks.com/en/tutorials/cors/

+0

私はこのケースであるため、指定されたアドレスは、のインスタンス化によって照会されていることをやって行くだろうかCORSに精通したがわかりませんイベントバス。これは、HTTPエンドポイントの場合にリダイレクトを正しく処理したため、Keycloak OAuthハンドラがイベントバスで正しく動作しないという症状です。 –

+0

CORSハンドラを追加しましたが、問題は解決しませんでした。http://vertx.io/docs/vertx-web/java/#_cors_handling –

+0

十分な価値があります。おそらく、3.3がリリースされるまで待つことをお勧めします。 – Will

関連する問題