Dieses Repository enthält Informationen zu möglichen Erweiterungen der PAIA-Spezifikation und des PAIA-Service der VZG um weitere Funktionen von OAuth 2.0 (RFC 6749) und ggf. OpenID Connect.
Mittels OAuth 2.0 kann Anwendungen gezielt Zugriff auf einzelne Funktionen von Benutzerkonten gewährt und das Benutzerkonto zum Single-Sign-On (SSO) an anderen Anwendungen verwendet werden. Da es sich eher um ein Framework mit verschiedenen Möglichkeiten handelt, ist festzulegen, welche konkreten Funktionen von OAuth 2.0 in welcher Form benötigt werden. Ein mögliches Profil bietet OpenID Connect.
PAIA-Spezifikation (ab 1.2.0) und PAIA-Server der VZG setzen bereits OAuth 2.0 in einer einfachen Variante ("Password Grant") um.
In OAuth-Terminologie besteht der PAIA-Server aus einem Resource Server (PAIA core) und aus einem Authorization Server (PAIA auth). Der Resource Server bietet Zugriff auf Benutzerkonten mittels Access Tokens, die vom Authorization Server bereitgestellt werden.
Access Tokens haben grundsätzlich eine begrenzte Gültigkeitsdauer und sind auf bestimmt Zugriffsrechten (Scopes) beschränkt. Für PAIA core sind die Scopes read_patron
, read_fees
, read_items
und write_items
möglich.
OAuth 2.0 sieht verschiedene verschiedene Verfahren (Grants) vor, mit denen Anwendungen wie die BibApp oder ein Benachrichtigungsserver (Clients) an Access Tokens zum Zugriff auf PAIA core kommen können:
Darüber hinaus können weitere Grants festgelegt werden. Im Wesentlichen basiert der Zugriff aus drei Teilen:
+--------+ +----------------------+
| |-- (1) Grant------------------>| Authorization Server |
| |<--(2) Access Token -----------| (PAIA auth) |
| | +----------------------+
| Client |
| | +-----------------+
| |-- (3) Zugriff mitt Access Token -->| Resource Server |
| |<-----------------------------------| (PAIA core) |
+--------+ +-----------------+
Abgesehen vom Password Grant besteht der erste Teil (1) je nach Verfahren aus mehreren Schritten in denen die Anwendung irgend einer Art von Zugangsdaten an den Authorization Server übermittelt. Dafür muss sie zunächst dem Authorization Server bekannt sein (Registrierung von Anwendungen) und sollte sich ihm gegenüber authentifizieren (Authentifizierung von Anwendungen).
Beim Resource Owner Password Credentials Grant übermittelt die Anwendung für jedes neue Access Token Benutzername und -passwort.
Vorteile
Nachteile
Dieses Verfahren ist bereits seit Version 1.2.0 in der PAIA-Spezifikation enthalten (PAIA auth login).
Client Credentials Grant unterscheidet sich vom Passwort Credentials Grant darin, dass für jede Anwendung eigene Zugangsdaten (client_id
und client_secret
) vergeben werden.
Vorteile
Nachteile
Der Client Credentials Grant eignet sich am Besten für Anwendungen, die vom Nutzer auf seinem eigenen Rechner selber ausgeführt werden und bietet somit nur geringe Vorteile gegenüber dem Passwort Grant. Client Credentials können allerdings zur Authentifizierung von Anwendungen zusätzlich zu anderen Verfahren verwendet werden.
Im Beispiel ist dieses Verfahren unter "Eigene Anwendungen" mit einem eigenen Konfigurationsformular illustriert.
Der Implicit Grant (aka "User-Agent Flow") bietet sich für JavaScript-basierte Webanwendungen an. Ebenso wie beim folgenden Authorization Code Grant ist festgelegt wie Nutzer der Anwendung explizit Zugriffsrechte einräumen können. Das Verfahren läuft in der Praxis folgendermaßen ab:
Um Zugriff auf ein Benutzerkonto zu erhalten, schickt die Anwendung den Nutzer im Webbrowser an den Authorization-Server und teilt mit, welche Berechtigungen (scopes) sie gerne hätte:
https://paia.gbv.de/DE-Hil2/oauth?response_type=token
&client_id=CLIENT_ID
&redirect_uri=REDIRECT_URI
&scope=read_patron%20read_items
&state=...
Sofern der Nutzer nicht am Authorization Server angemeldet ist (Cookie), meldet er sich mit Nutzername und Passwort dort an (beachte, dasss die Anwendung in der ersten URL nicht mit angibt, für welchen Nutzer sie Berechtigungen möchte, dies ergibt sich implizit durch das Login).
Falls vom Nutzer (noch) keine Berechtigungen für die Anwendung vergeben wurden, bekommt er vom Authorization Server ein Bestätigungs-Formular präsentiert:
Nach Bestätigung des Nutzes oder direkt, falls der Nutzer der Anwendung schon früher die benötigten Berechtigungen erteilt hat, erfolgt direkt eine Weiterleitung an die zur Anwendung hinterlegten REDIRECT_URL. Dabei werden im Fragment-Identifier der URL Access Token und weitere Felder mitgeschickt, welche beim Password Grant als JSON-Objekt zurückgeliefert werden würden:
https://bibapp.de/notify/callback#token_type=Bearer
&scope=read_patron%20read_items
&access_token=...
&expires_in=...
&state=...
Wenn der Nutzer nicht die benötigten Rechte erteilt, wird eine Fehler-Antwort an die REDIRECT_URL geschickt:
https://bibapp.de/notify/callback#error=access_denied
Falls der Nutzer noch am Authorization Server angemeldet ist und den Zugriff schon bestätigt hatte, wird er direkt zur Anwendung umgeleitet, bekommt von der gesamten Transaktion also nichts mit.
Vorteile
Nachteile
Authorization Code Grant (aka "Web Server Flow") bietet die meisten Möglichkeiten, ist jedoch auch in der Implementierung umfangreicher. Der vollständige Ablauf ist hier dargestellt:
+---------+ +---------------+
| |---(1) client_id, redirect_uri & scope -->| |
| Browser |---(2) Nutzer meldet sich an ------------>| Authorization |
| |<--(3) Authorization Code ----------------| Server |
+---------+ | |
^ | | (PAIA auth) |
| (3) | |
(1) | | |
| v | |
+--------+ | |
| |---(4) Authorization Code ---------------->| |
| |<--(5) Access Token & Refresh Token -------| |
| Client | | |
| |---(8) Refresh Token --------------------->| |
| |<--(9) Access Token & ggf. Refresh Token --| |
| | +---------------+
+--------+
^ | +-----------------+
| \----(6) Access Token ----------------------->| Resource Server |
\------(7) Zugriff (bis Token abgelaufen) ------| (PAIA core) |
+-----------------+
Das Verfahren läuft zunächst wie beim Implicit Grant ab:
Anwendung schickt Nutzer an Authorization Server, allerdings mit einem anderen response_type
:
https://paia.gbv.de/DE-Hil2/oauth?response_type=code
&client_id=CLIENT_ID
&redirect_uri=REDIRECT_URI
&scope=read_patron%20read_items
&state=...
Nutzer muss sich ggf. anmelden und beim ersten Zugriff die Zugriffsberechtigung erteilen (siehe Beispiel-Mockup BibApp, Benachrichtigungsdienst und Campus-Community).
Der Authorization Server leitet den Nutzer an die redirect_uri
der Anwendung zurück, allerdings mit einem Authorization Code, der in der Query-Komponente der URL mitgeschickt wird:
https://bibapp.de/notify/callback?code=AUTH_CODE&state=...
Im Fehlerfall wird der Fehler ebenfalls als Query-Parameter mitgeschickt:
https://bibapp.de/notify/callback?error=...
Der Authorization Code hat nur eine sehr begrenzte Gültigkeitsdauer und dient lediglich dazu, ein erstes Access Token und ein Refresh Token anzufordern. Dies geschieht über die PAIA auth Methode login, allerdings mit einem anderen Anfrage-Parametern:
POST https://paia.gbv.de/DE.Hil2/login
grant_type=authorization_code
&code=AUTH_CODE
&client_id=CLIENT_ID
&redirect_uri=REDIRECT_URI
Die redirect_uri
ist bei dieser Anfrage eigentlich überflüssig, da sie sich bei Registrierung von Anwendungen aus der client_id
ergibt, muss aber laut Spezifikation nochmal mitgeschickt werden.
Die Antwort des Authorization Server enthält im Erfolgsfall neben dem Access Token eine Refresh Token:
{
"access_token": "...",
"token_type": "Bearer",
"expires_in": ...,
"refresh_token": "REFRESH_TOKEN"
}
Die Anwendung hat wie bei den anderen Grants Zugriff per Access Token...
...bis das Access Token abgelaufen ist
Das Refresh Token hat im Gegensatz zum Access Token eine lange Gültigkeit (z.B. 1 Jahr) und wird nur benutzt um Access Token zu verlängern oder neue Access Tokens anzufordern. Dies geschieht ebenfalls an der PAIA auth Methode login. Auch hierbei wir empfohlen client_id
und client_secret
zur Authentifizierung von Anwendungen mitzuschicken:
POST https://paia.gbv.de/DE.Hil2/login
grant_type=refresh_token
&refresh_token=REFRESH_TOKEN
&scope=... (optional)
Die Antwort enthält im Erfolgsfall ein Access Token und ggf. auch ein neues Refresh Token. Refresh Tokens haben den Vorteil, dass sie nie an den Resource Server geschickt und so weniger leicht kompromitiert werden können.
Vorteile
Nachteile
Der Password Grant und Client Credentials Grant sind zwar am einfachsten umzusetzen, erfordern aber dass Anwendungen die Zugangsdaten sicher verwalten. Daher wird vom Einsatz abgeraten sofern die Anwendung nicht unter vollständiger Kontrolle des Nutzers läuft. Dies trifft auf mobile Endgeräte, im Gegensatz zu selbst administrierten Computern, strenggenommen nicht zu.
OAuth 2.0 fordert eine Registrierung von Anwendungen, legt dafür aber kein einheitliches Verfahren fest. Bei OpenID Connect ist hierfür eine eigene Funktion definiert (RFC 7591). Es ist also zu klären, wie Anwendungen ohne allzu großen administrativen Aufwand registriert werden können. Sinnvoll wäre auch ein Verfahren, dass für mehrere PAIA-Server gleichzeitig funktioniert.
In jedem Fall müssen Anwendungen zunächst am Authorization Server mit mindestens folgenden Angaben registriert werden:
Bei der Registrierung erhält die Anwendung eine eindeutige, nicht geheime client_id
und bei Bedarf ein client_secret
.
Es wird empfohlen, dass Anwendungen sich bei Anfragen an den Authentification Server zusätzlich mit ihren client_id
und client_secret
per HTTP Basic authentification (RFC 2617) authentifizieren. Zur Not kann auch der Empfang der beiden Felder im Request body unterstützt werden, dies wird jedoch nicht empfohlen. Ohne Authentifizierung der Anwendung können sich Angreifer bei Kenntnis der CLIENT_ID als andere Anwendung ausgeben -- deshalb sollten die REDIRECT_URL bei Anfragen nicht frei wählbar sondern pro Anwendung festgelegt sein.
Zusätzlich sieht OAuth die Möglichkeit vor, das Anwendungen Tokens explizit als ungültig markieren können. Für den Passwort Grant entspricht dies in etwa der vorhandenen PAIA auth Methode logout. Im Detail ist diese Methode jedoch nicht entsprechend der OAUth-Spezifikation umgesetzt (siehe Issue der PAIA-Spezifikation). Da Token Revocation optional ist, kann zunächst auf die Umsetztung verzichtet werden, zumal in der Praxis ggf. ausreicht, das Refresh Token zu löschen.
Obgleich es so scheinen mag, dient OAuth selbst nicht der Authentifizierung oder Authorisierung sondern deren Deligierung. In welcher Form der Authorization Server Nutzer authentifiziert und die gewünschten Berechtigungen bestätigt ist nicht festgelegt. Grundsätzlich sind Nutzer und Berechtigungen bei einem Identity Provider (IdP) hinterlegt, der im einfachsten Fall aus einer Nutzerdatenbank besteht.
Die Abfrage am IdP kann intern erfolgen:
+---------+ +---------------+
| |---(1) client_id, redirect_uri & scope -->| Authorization |
| Browser |---(2) Nutzer meldet sich an ------------>| Server |
| |<--(3) Authorization Code ----------------| |
+---------+ +---------------+
^ | | interne ^
| v v Abfrage |
+--------+ +------------------+
| Client | | Identiy Provider |
+--------+ +------------------+
Es ist aber denkbar, dass der Authorization Server den Nutzer direkt an den IdP weiterleitet, wo sich dieser die Anfrage bestätigt:
+---------+ +---------------+
| |---(1) client_id, redirect_uri & scope -->| Authorization |
| Browser |<--(3) Authorization Code ----------------| Server |
| |--\ | |
+---------+ | +---------------+
^ | | | ^
| | | Redirect (1) (3) OK + patron
| v | v |
+--------+ | +------------------+
| Client | \--(2) Nutzer meldet sich an ------->| Identiy Provider |
+--------+ +------------------+
Hierbei muss jedoch sichergestellt werden dass dem Authorization Server kein scheinbar vom IdP stammendes gefälschtes "OK" untergeschoben werden kann.
Als Beispiel wird ein PAIA auth Server mit der Basis-URL https://paia.gbv.de/DE-Hil2/auth und eine Anwendung mit der Basis-URL https://bibapp.de/notify/ angenommen.
Insgesamt ist OAuth 2.0 sehr komplex, es muss aber nicht in seiner Gänze umgesetzt werden. Vermutlich ist es am Besten zunächst den Authorization Code Grant umzusetzen, auch wenn dieses Verfahren das umfangreichste ist.
Damit Nutzer Anwendungen authorisieren können, benötigt der PAIA-Server zunächst eine Benutzeroberfläche mit mindestens den folgenden Funktionen:
Login am Benutzerkonto (Benutzername & Passwort). Da das Login nur für die Benutzeroberfläche des PAIA auth Servers gilt, reicht ein einfaches Cookie, das für den Implicit Grant eine längere Lebensdauer haben sollte.
Für den Client Credential Grant käme hinzu:
Eine (noch komplexere) Alternative zu OAuth 2.0 ist SAML (z.B. Shibboleth)