Einführung in die OpenID-Java-Bibliothek openid4java

Know-how  –  Kommentare

Der erste Teil dieser heise Developer-Artikelserie zum Thema "Internet-Identität und Datenaustausch" hat das SSO (Sigle-Sign-on)-Protokoll OpenID vorgestellt. Der zweite Beitrag taucht jetzt tiefer in die Implementierungswelt von OpenID ein. Inwiefern die vorhandenen OpenID-Bibliotheken tatsächlich einfach zu bedienen sind, zeigt exemplarisch die OpenID-Bibliothek openid4java.

Internet-Identität und Datenaustausch heute – Nutzung und Möglichkeiten von OpenID und OAuth

+ Identity Management: Authentifizierungsdienste mit OpenID
+ Einführung in die OpenID-Java-Bibliothek openid4java
+ Web-2.0-Datenmanagement: Datenaustausch mit OAuth – Einführung in die Bibliothek OAuth Core for Java
+ OpenID und OAuth: Zusammen für ein besseres Internet?

Der Schluss des ersten Artikels zeigte, wie die Integration von OpenID aus Konsumenten-Sicht auszusehen hat. Die Anbindung des Protokolls an einer vorhandenen Konsumenten-Webanwendung muss einfach sein, denn Verbreitung und Akzeptanz des Protokolls sind definitiv von der Anzahl der Konsumenten abhängig.

OpenID-Bibliotheken und Konsumentenintegration

Für die Integration beziehungsweise Anbindung der OpenID-Authentifizierung existieren viele Bibliotheken für unterschiedliche Programmiersprachen. Die in diesem Artikel vorgestellte Bibliothek openid4java hat einen hohen Reifegrad erreicht. Eine Alternative im Java-Umfeld wäre höchstens noch das Projekt joid.

Die Szenarien zur Anbindung von OpenID beschränken sich ausschließlich auf die Nutzung des Protokolls für SSO-Systeme. Andere Szenarien wie die Überprüfung des Attributs "über 18 Jahre" sind mit den im ersten Artikel genannten OpenID-Spezifikationen ebenfalls denkbar. Zur Vorbereitung der gezeigten Beispiele sei auf den Exkurs "Verwendung von openid4java" hingewiesen.

Die dort vorgestellten Schritte sollten vollständig durchgeführt sein. Das Anbinden eines Providers mit openid4java geschieht mit der Hauptklasse ConsumerManager. Den Authentifizierungsprozess kann man in der Beispielklasse ConsumerServlet im Eclipse-Projekt openid.consumer.servlet komplett durchlaufen. Die folgenden sind die wichtigsten Punkte in der Klasse ConsumerServlet:

  1. Attributsübertragung: Eine Konstante OPENID_ATT, die man am Anfang der Klasse definiert hat, wählt die Übertragung der Attribute aus. Zur Auswahl stehen die Spezifikationen "SReg" und "AX". Erstere regelt den Austausch von Identitätsattributen mit einer festen Anzahl von acht vorgegebenen Attributen, Letztere den unbegrenzten, selbst definierbaren und erweiterbaren Austausch von Identitätsattributen.
  2. Proxy-Einstellungen: Falls der Rechner hinter einem Proxy-Server liegt, kann man die Proxy-Einstellung in der Methode init(ServletConfig config) aktivieren.
  3. Redirect: Je nach OpenID-Spezifikation ist HTTP GET Redirect (Version 1.x) oder HTTP FORM Redirect (Version 2.0) für die indirekte Kommunikation zu wählen. Dies lässt sich in der Methode authRequest(String userSuppliedString, HttpServletRequest httpReq, HttpServletResponse httpResp) betrachten.
  4. Ergebnis: Die Methode verifyResponse(HttpServletRequest httpReq) überprüft das Verifikationsergebnis des Providers. Ist das Ergebnis in Ordnung, generiert die Klasse ConsumerServlet eine HTML-Seite als Zusammenfassung.

Implementierung eines eigenen OpenID-Providers

Bei einem verteilten Identitäts-Provider kann jeder als Anbieter fungieren. openid4java liefert einige Beispiele, wie ein Provider zu implementieren ist. Der Artikel stellt jedoch ausschließlich das mitgelieferte Beispiel vor und erklärt es. Das Eclipse-Projekt openid.server.servlet mit einer einzigen Servlet-Klasse OpenIdServlet stellt einen exemplarischen OpenID-Provider zur Verfügung. Folgende Details sind die wichtigsten Punkte der Implementierung:

  1. OpenID-Provider-Version: Durch die Konstante OPENID_VERSION, die man am Anfang der Klasse definiert, lässt sich die Provider-Version der Spezifikation auswählen. Zur Auswahl stehen die Versionen "1.x" und "2.0".
  2. OpenID-Konto: Unter folgendem Link findet man das OpenID-Konto: http://localhost:8080/server-servlet/provider?id=user.
  3. OpenID-Endpunkt: Der richtige Endpunkt des Providers liegt unter dem Link: http://localhost:8080/server-servlet/provider.
  4. Kommunikation: HTTP-GET (doGet) kommt bei der indirekten und HTTP-POST (doPost) bei der direkten Kommunikation zum Einsatz.
  5. Die Methode userInteraction(ParameterList request) kann eine Endbenutzer-Interaktion – falls gewünscht – behandeln. Als Beispiel einer solchen Interaktion darf ein Endbenutzer-Login gelten.

Zusätzlich zu den beiden Projekten (openid.consumer.servlet und openid.server.servlet) steht ein drittes Projekt openid.simple.sample zur Verfügung. Es vereint Konsument und Provider auf einer Webanwendung in Form von mehreren JSP (JavaServer Pages)-Dateien.