© DrHitch/Shutterstock.com
OAuth 2.0

3 Implementierung eines OAuth-2.0-Servers mit Spring Security


Im dritten und letzten Kapitel dieses OAuth-2.0-shortcuts wechseln wir die Seiten: vom Client hin zum Server. Wenn Sie selbst ein API anbieten und Clients per OAuth 2.0 autorisieren wollen, so müssen Sie das Protokoll entweder selbst implementieren oder ein vorhandenes Framework verwenden. Wir entschieden uns für die letztere Option und stellen Ihnen vor, wie Sie einen standardkonformen OAuth 2.0 Authorization Server per Spring Security und dessen OAuth-2.0-Modul realisieren können.

Wenn Sie einen Blick auf die Website www.oauth2.net/2 werfen, so entdecken Sie direkt auf der Homepage im unteren Teil eine Reihe von Implementierungen – sortiert nach Client und Server. Sofort fällt auf, dass es mehr Client-Libraries gibt. Im Bereich der Serverimplementierungen und gerade im Bereich Java sah es lange Zeit mau aus. Mittlerweile gibt es drei auf Java basierende Serverimplementierungen, die hier genannt werden:

  • Apache Amber
  • Apis Authorization Server
  • Spring Security for OAuth

Apache Amber unterstützt aktuell die Revision 22 des OAuth-2.0-Protokolls, die mit September 2011 datiert ist. Der Apis Authorization Server ist laut der Dokumentation auf dem aktuellsten Stand (am 8. Dezember 2012 war das die v31) und mit Sicherheit einen Blick wert, wenn Sie keine ansonsten auf Spring basierende Systeme haben. Da Spring Security weit verbreitet ist und das Spring-Security-Modul für OAuth 2.0 noch dazu auf dem aktuellsten Stand ist, fiel unsere Entscheidung bei der hybris GmbH auf dieses Modul.

Wir gehen im Folgenden nicht auf die Details zu Spring Security selbst ein. Dazu wurde und wird viel geschrieben. Wir gehen davon aus, dass Sie eine auf Spring-Security-basierende Java-Webapplikation auf OAuth 2.0 „upgraden“ wollen. In vielen Fällen bedeutet dies, HTTP Basic Authentication endlich herauszunehmen und auf OAuth 2.0 zu setzen.

Installation

Der Code des OAuth-2.0-Moduls wird auf GitHub verwaltet und ständig an neuere Revisionen des OAuth-2.0-Protokolls angepasst. Auch wenn sich OAuth 2.0 auf der Zielgeraden zur fertigen und empfohlenen Spezifikation befindet, gibt es meist alle paar Tage kleinere Änderungen. Sie können entweder das Git Repository klonen und alle paar Wochen die neuesten Änderungen ziehen, oder Sie nehmen einfach die unter den Downloads bereitgestellten zip- oder tar.gz-Archive. Nach dem Entpacken oder Klonen wechseln Sie in das Verzeichnis spring-security-oauth2 und führen dort mvn package aus, um die Quelldateien zu kompilieren und im target-Verzeichnis ein fertiges JAR-File vorzufinden. Fügen Sie das Spring OAuth 2.0 JAR-File Ihrem WEB-INF/lib-Verzeichnis hinzu (oder passen Sie entsprechend Ihre Maven-Konfiguration an), und es kann losgehen.

Tonr und Sparklr

An dieser Stelle sei auch auf Tonr und Sparklr [1] hingewiesen, die beiden OAuth-2.0-Beispielapplikationen direkt von Spring Security. Die beiden Webapplikationen geben Beispiele für einen (Spring-)OAuth-2.0-Client und -server. Ebenso wie das OAuth-2.0-Modul finden Sie diese beiden Apps im samples-Verzeichnis des Spring Security OAuth 2.0 Repositories. Stellen Sie sicher, dass Sie die Beispiele für OAuth2 betrachten, da sich diese natürlich sehr stark von OAuth 1.0 unterscheiden.

Spring Security OAuth 2.0 konfigurieren

Die vorzunehmende Spring-Konfiguration für das OAuth-2.0-Modul besteht aus folgenden Teilen:

  • Vorbereitung der bestehenden Spring-Konfigurationsdateien
  • Konfiguration der OAuth-2.0-Clients, die auf Ihr API Zugriff haben sollen
  • Konfiguration des Tokenmanagements (Access/Refresh-Tokens) sowie des Token-Endpoints
  • Konfiguration und Erstellung des Authorization Servers inklusive der Konfiguration der Authorization und Token-Endpoints
  • Absicherung der vorhandenen APIs, sprich: des Resource-Servers

Vorbereitung der Spring-Konfiguration

Um die speziellen Spring OAuth-2.0-Tags in Ihrer Konfiguration nutzen zu können, müssen Sie zunächst die Spring-Konfiguration um den OAuth2 Namespace erweitern (Listing 3.1).

<beans xmlns="http://www.springframework.org/schema/beans"
...
xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xsi:schemaLocation="http://www.springframework.org/schema/aop
...
http://www.springframework.org/schema/security/oauth2
http://www.springframework.org/schema/security/spring-security-oauth2-1.0.xsd">
...

Listing 3.1

Der Namespace oauth wurde eingeführt, und ebenso haben wir das XML Schema dafür angegeben. In Eclipse und anderen Entwicklungstools haben Sie dadurch den Vorteil, Auto Completion nutzen zu können.

OAuth-2.0-Clients

Alle OAuth-2.0-Clients, die auf Ihr API oder Ihre Webapplikation generell zugreifen dürfen, müssen im ClientDetailsService eingetragen sein. Der ClientDetailsService informiert über die OAuth-2.0-Clients, die mit ClientDetails-Objekten verwaltet werden. Wenn Sie ein API planen, das über eine Clientregistrierung jederzeit neue OAuth-2.0-Clients verwalten muss, so sollten Sie das ClientDetailsService-Interface (besser: die Klasse BaseClientDetails, die dieses Interface implementiert) von Spring überschreiben. Sie können dann die verfügbaren OAuth-2.0-Clients selbst verwalten, beispielsweise in einer Datenbank. In diesem Fall handelt es sich bei Ihrem API um ein Public API. In den meisten Fällen reicht für private APIs eine statische Konfiguration. Bei privaten APIs ist die Anzahl der Clients (nicht Nutzer!) meist recht gering, und vor allem kommt nicht andauernd ein neuer Client hinzu. Spring bietet für diese Fälle auch eine In-Memory-Implementierung an, die wir hier vorstellen.

<oauth:client-details-service id="clientDetails">
<oauth:client client-id="client-side" resource-ids="myresource"
authorized-grant-types="implicit" authorities="ROLE_CLIENT"
redirect-uri="http://localhost:8080/oauth2_implicit_callback" />
<oauth:client client-id="mobile_android" resource-ids="myresource"
authorized-grant-types="authorization_code,refresh_token,password,client_credentials"
authorities="ROLE_CLIENT" secret="ganzgeheim"
redirect-uri="http://localhost:8080/oauth2_...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang