2016-05-04 8 views
3

Ich bin derzeit das Schreiben eines einfachen Prototyps Vert.x 3.3 Anwendung (Neueste Github bauen mit Jitpack.io) zu sichern, die http-Endpunkte und die EventBus mit Keycloak zu sichern versucht.Wie Vert.x 3.3 EventBus Brücke mit Keycloak

Ich habe zwei vertikale und statische Indexseite mit einer Schaltfläche zum Senden von Nachrichten. Alles funktioniert ungesichert, aber ich weiß nicht, wie man die SockJS Eventbus Bridge mit Keycloak absichert. Das Sichern des HTTP-Endpunkts funktioniert einwandfrei.

Da Vert.x 3.3 noch nicht offiziell veröffentlicht wurde, konnte ich nicht viele Informationen finden. http://vertx.io/blog/vertx-3-and-keycloak-tutorial/ nur bedeckt den HTTP-Endpunkt zu sichern und die 3,21-Dokumentation über die Zulassung erforderlich ist speziell die BasicAuthHandler für die Verwendung, die ich bin nicht sicher, wie man mit Keycloak ändern zu arbeiten: http://vertx.io/docs/vertx-web/java/#_requiring_authorisation_for_messages

Zur Zeit habe ich den folgenden Code:

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" + 
          "}"); 
    } 
} 

Mein Static HTML ist:

<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 
    }); 
} 

Wenn die vertikale läuft es keine Fehler, aber Chrom-Entwickler-Tools zeigt folgende Fehler nach dem Login über keycloak:

XMLHttpRequest cannot load http://localhost:8180/auth/realms/Prototype/protocol/openid-connect/auth?re…direct_uri%3D%2Feventbus%2Finfo&state=&client_id=prototype-eventbus&scope=. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8091' is therefore not allowed access. 

Antwort

1

, der wie ein CORS Ausgabe aussieht.

Durch das Aussehen Ihrer Fehler kann man nur in der Lage sein, die folgenden Header in der Antwort hinzuzufügen:

Access-Control-Allow-Origin: * 

oder

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

je nachdem, wie viel Sie für die Sicherheit.

Das ist normalerweise ausreichend für einfache GET für Text/HTML, aber wenn Sie andere Inhaltstypen (zB JSON) oder PUT/oder DELETE-Methoden behandeln wollen, müssen Sie mehr Header hinzufügen, um sie zu erlauben.

Einige Ressourcen:

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

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

+0

Ich bin mit CORS vertraut, aber nicht sicher, wie ich tun, dass da in diesem Fall die bezeichnete Adresse durch die Instanziierung abgefragt wird gehen würde der EventBus. Es scheint wahrscheinlich, dass dies ein Symptom dafür ist, dass der Keycloak OAuth-Handler nicht richtig für den Eventbus funktioniert, da er im Fall des http-Endpunkts die Weiterleitung korrekt gehandhabt hat. –

+0

Nur um sicher, dass ich einen CORS-Handler hinzugefügt, aber es hat nicht mein Problem zu lösen: http://vertx.io/docs/vertx-web/java/#_cors_handling –

+0

Ja fair genug - einen Versuch wert. Am besten warten, bis 3.3 veröffentlicht ist. – Will