Ich wollte mich endlich mit einem der Themen beschäftigen, die bereits seit langem auf meiner Weiterbildungsliste stehen: Single Sign On und OAuth
Ich habe mich bereits vor einigen Wochen an dieses Thema erinnert: Für die Arbeit musste ich einen Client an einem Rest-Service das erste Mal über OAuth authentifizieren. Die Gegenseite (Betreiber des Service) erwähnten gesprächshalber, dass ihre Infrastruktur für die Authentifizierung Keycloak einsetzt. Ich hatte bisher - was die Infrastruktur angeht - vor allem Informationen zu Hydra gefunden - allerdings war das schon vom Durchlesen her irgendwie so kompliziert, dass es sich wie Arbeit anfühlte und das war sicher ein Grund dafür, dass es so lange dauerte, bis ich mich jetzt endlich dazu durchrang, praktiche Erfahrungen zu sammeln.
Aber vorher benötigte ich eine Anwendung, die per Single Sign On funktionierte, damit ich nicht auf der grünen Wiese beginnen musste - dann wäre bei nicht funktionieren wieder nicht klar gewesen, ob es am Client oder der Konfiguration des OAuth-Servers liegt. Ich wollte möglichst viele Fehlerquellen ausschließen.
Zum Glück fand ich ein sehr umfassendes Beispielprojekt auf der Basis von Javalin - derselben Technologie, auf der ich auch bereits meinen Testdatengenerator aufbaute.
Mit diesem Projekt begann ich zunächst einige Experimente- wie etwa mich mittels meines GitHub-Accounts zu authentifizieren. Das funktionierte hervorragend und ohne, dass ich an dem Projekt irgendetwas ändern musste.
Damit konnte ich nun beginnen, meinen eigenen Authentifizierungs-Server aufzusetzen. Ich folgte der Anleitung und war bald darauf mit einem Keycloak-Server belohnt, an dem ich mich per OpenID (mit einigen kleinen Änderungen) aus der Web-Applikation heraus authentifizieren konnte.
Allerdings reichte mir das als Erfolg noch nicht - in der ursprünglichen Web-Applikation wird einfach nach erfolgreichem Login dem Nutzer fest eine Rolle zugeordnet, die im Quelltext fest hinterlegt ist - Ich wollte aber, dass die Rolle dynamisch zugeteilt wird - je nachdem, wie der Nutzer auf dem Keycloak-Server administriert ist. Diese Informationen sollten eigentlich in den Token enthalten sein, die im Zuge des Authentifizierungsprozesses zwischen Client und Server ausgetauscht werden. Bei mir fehlten diese aber.
Das war der Punkt, der ein wenig mehr Forschungsaufwand nach sich zog: Ich habe einige Zeit und etliche Ressourcen im Internet benötigt, bis ich auf das magische Schlüsselwort stieß: Mapper!
Ich möchte hier noch kurz erklären, was ich mir präzise wünschte: Ich wollte im Client auf folgende Informationen zugreifen können:
Keine dieser Informationen wird von Keycloak automatisch übertragen - man muss für jede einen Mapper anlegen. Mapper werden in der Administrationsoberfläche von Keycloak über die Clients (Anwednungen) konfiguriert - an jedem Client existiert dafür ein eigener Tab.
Für Attribute wird create Type User Attribute benutzt - Dabei ist wichtig, dass ein Mapper pro Attribut benötigt wird!
Für Realm Roles wird create User Realm Role benutzt. Hier genügt ein Mapper - unter dem angegebenen Schlüssel wird eine Liste aller Realm Roles übertragen.
Für Roles wird create User Client Role benutzt - hier gilt das schon für Realm Roles Gesagte: Die Werte werden als Liste übertragen, daher ist auch hier nur ein Mapper notwendig - egal wie viele Roles definiert sind.
Für Groups wird create Group Membership benutzt - Auch hier wird unabhängig von der Anzahk der Gruppenzugehörigkeiten nur ein Mapper benötigt - auch die Gruppen werden als Liste im Token übertragen.
Im Client kann man nun auf die jeweils definierten Elemente im Token zugreifen und so zum Beispiel die Rollen für die weitere Benutzung in Javalin auslesen.
Abschließend sei noch angemerkt, dass es sehr einfach ist, die Authentifizierung zentral im Keycloak-Server auf Zwei-Faktor-Authentifizierung umzustellen - man kann sogar das System so aufsetzen, dass ein zweiter Faktor mandatorisch ist. Dazu existieren verschiedene Möglichkeiten, die man als zweiten Faktor benutzen kann - am einfachsten (für mich) aufzusetzen war eine One-Time-Passwort-Lösung mit zum Beispiel dem Google Authenticator. Es existiert ebenfalls die Möglichkeit, hierfür FIDO oder U2F zu nutzen - die praktische Erprobung steht bei mir allerdings noch aus...
02.07.2021
Es gibt wieder Zuwachs in meinem Docker-Zoo:
11.06.2021
Ich berichtete neulich über die Installation und erste Tests von Keycloak. Nun bin ich tiefer eingetaucht und habe die diversen Möglichkeiten untersucht, die Authentifizierung mittels zweiten Faktors sicherer zu machen.
Multi-User-WebDAV, Docker, GitHub
17.11.2019
Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.
Weiterlesen...Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.
Weiterlesen...Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.