Sep22
Authentifizierung und Autorisierung mit vert.x 2

vert.x bietet eine Möglichkeit zur Authentifizierung und Autorisierung. Leider klappt das nicht ganz so wie im Internet Tutorial beschrieben. Wie es klappt zeige ich in diesem Artikel.

Das Web Application Tutorial für vert.x 2 zeigt, im Abschnitt „Step 8. Handling Login“, wie man eine Authentifizierung und Autorisierung mit vert.x 2 durchführt. Dabei wird der Basic Auth-Mgr verwendet. Im Detail möchte ich hier nicht weiter darauf eingehen und auf das Tutorial verweisen.

Kurz gesagt ruft vert.x den konfigurierten Auth-Mgr auf, sobald vom Client eine Message an eine Bus-Adresse gesendet wird, die mit „requires_auth:true“ abgesichert wurde. In der Doku heißt es, in der Message muss ein Attribut sessionid mitgesendet werden. Value von diesem Attribute muss die sessionid sein, die man beim Login vom Auth-Mgr bekommen hat. Die Session-ID wird dem Auth-Mgr übergeben, anhand dessen er prüft, ob die Message an die Bus-Adresse gesendet werden darf.

Also gut, meine Message an den Server bekommt, neben den eigentlichen Nutzdaten, noch die sessionid und ….

"Inbound message for address ... rejected because it requires auth and
 sessionID is missing"

ist alles was ich bekommen habe.

Was ich zunächst für einen Bug gehalten habe, stellt sich als unklare Beschreibung in der Doku heraus.
Eine Message in vert.x besteht aus einem Envelope und dem Payload. Die sessionid muss direkt im Envelope und nicht im Payload stehen. Ich habe die sessionid im Payload stehen, deshalb findet vert.x sie nicht. Leider bietet der Client des Event-Bus keine API um Attribute in den Envelope zu setzen. Aber im Code des Event-Bus Clients ist ein Attribute sessionid zu finden, dass automatisch in den Envelope gesetzt wird, sobald eine Message gesendet wird. Eine Möglichkeit die sessonid zu setzen sucht man leider vergebens.

Zum Glück bietet JavaScript eine Möglichkeit die Funktionalität von Objekten zu erweitern. Folgender Code in Zeile 3-5 fügt der Event-Bus Instanz eine Funktion hinzu um die sessionid zu setzen. Diese Zeilen fügt man, wie im Code zu sehen, am besten nach der Instantiierung des Event-Buses in den eigenen JavaScript-Client ein.

var eb = new vertx.EventBus(window.location.protocol + '//' + window.location.hostname + ':' + window.location.port + '/eventbus');
// dem Bus eine Methode hinzufügen um die SessionID zu setzen
eb.setSessionID = function(id) {
   this.sessionID = id;
}

Damit kann die sessionid beim senden einer Message gesetzt werden.

eb.setSessionID($window.sessionStorage.token);
eb.send(adress, data, callback);

Mit diesen wenigen Zeilen Code in der JavaScript Client Anwendung funktioniert die Autorisierung mit vert.x problemlos.

Schreibe einen Kommentar

Anmelden um einen Kommentar abzugeben.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*