Forward-Auth, eine weitere Option für die Authentifizierungsfunktion
API7.ai
January 26, 2022
Forward Auth verlagert geschickt die Authentifizierungs- und Autorisierungslogik auf einen dedizierten externen Dienst, bei dem das Gateway die Anfrage des Benutzers an den Authentifizierungsdienst weiterleitet und die ursprüngliche Anfrage blockiert und das Ergebnis ersetzt, wenn der Authentifizierungsdienst mit einem Nicht-20x-Status antwortet. Auf diese Weise ist es möglich, einen benutzerdefinierten Fehler zurückzugeben oder den Benutzer im Falle eines Authentifizierungsfehlers auf die Authentifizierungsseite umzuleiten.
Prinzip
Das Prinzip und der Ablauf des forward-auth-Plugins
in Apache APISIX sind in der obigen Abbildung dargestellt und werden in den folgenden Schritten zusammengefasst.
- Schritt 1: Ein Client stellt eine Anfrage an APISIX
- Schritt 2: APISIX stellt eine Anfrage an den vom Benutzer konfigurierten Authentifizierungsdienst
- Schritt 3: Der Authentifizierungsdienst antwortet (2xx oder Ausnahmestatus)
- Schritt 4: Basierend auf der Antwort des Authentifizierungsdienstes entscheidet APISIX, ob die Anfrage an das Upstream weitergeleitet oder eine Ablehnungsantwort direkt an den Client gesendet wird
Verwendung
Schritt 1: Einrichten des Authentifizierungsdienstes
Angenommen, es gibt einen Authentifizierungsdienst, an den der Benutzer eine Anfrage mit einem Authorization-Header sendet. Wenn diese Daten die Authentifizierung bestehen, wird ein Statuscode 200 und ein Antwortheader namens X-User-ID
zurückgegeben; wenn die Authentifizierung nicht bestanden wird, wird der Authentifizierungsstatus als abgelaufen betrachtet und ein Statuscode 302 sowie ein Location
-Antwortheader zurückgegeben, um den Client zur Anmeldeseite umzuleiten.
Schritt 2: Erstellen einer Route und Aktivieren des forward-auth
-Plugins
Als Nächstes konfigurieren wir eine Route und aktivieren das forward-auth
-Plugin, um den oben genannten Authentifizierungsdienst mit der Upstream-Anwendung zu verbinden.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"forward-auth": {
"address": "http://127.0.0.1:9080/auth",
"request_headers": ["Authorization"],
"upstream_headers": ["X-User-ID"],
"client_headers": ["Location"]
}
},
"uri": "/user"
}'
Die obige Konfiguration wird wie folgt erläutert.
- Wenn eine Anfrage mit der aktuellen Route übereinstimmt, wird eine Anfrage an die in
address
angegebene Adresse gesendet, wobei der inrequest_headers
definierte Authorization-Header (d.h. der Anfrageheader, der vom Client an den Authentifizierungsdienst weitergeleitet werden soll, falls nicht festgelegt, wird kein Anfrageheader weitergeleitet) verwendet wird, wodurch der Authentifizierungsdienst die Identität des Benutzers bestätigen kann. - Wenn die Authentifizierung erfolgreich ist, wird der Statuscode 200 zurückgegeben und ein
X-User-ID
-Header, wie inupstream_headers
definiert (d.h. der Anfrageheader, der bei erfolgreicher Authentifizierung vom Authentifizierungsdienst an das Upstream weitergeleitet werden soll, falls nicht festgelegt, wird kein Anfrageheader weitergeleitet). - Wenn die Authentifizierung fehlschlägt, wird der Statuscode 302 zurückgegeben und ein
Location
-Header, wie inclient_headers
definiert (d.h. der Antwortheader, der vom Authentifizierungsdienst an den Client gesendet wird, wenn die Authentifizierung fehlschlägt, oder kein Antwortheader, falls nicht festgelegt).
Schritt 3: Testanfragen
# Anfrage und Daten mit POST senden
curl http://127.0.0.1:9080/user \
--header 'Authorization: true'
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 28
Server: APISIX/2.11.0
{"user_id":"i-am-real-user"}
# Anfrage mit GET
curl -i http://127.0.0.1:9080/user \
--header 'Authorization: false'
HTTP/1.1 302 FOUND
Server: APISIX/2.11.0
Location: https://example.com/auth
Anhang: Deaktivieren des Plugins
Wenn Sie das Forward Auth Plugin nicht mehr benötigen, entfernen Sie einfach die forward-auth
-Plugin-Konfiguration aus der Routenkonfiguration und speichern Sie sie, um das Forward Auth Plugin auf der Route zu deaktivieren.
Dank der dynamischen Natur von Apache APISIX ist kein Neustart von Apache APISIX erforderlich, um das Plugin ein- oder auszuschalten.
Zusammenfassung
Um weitere Informationen über die Beschreibung des forward-auth
-Plugins und die vollständige Konfigurationsliste zu erhalten, können Sie die offizielle Dokumentation konsultieren. Wenn Sie komplexere Authentifizierungs- oder Autorisierungsanwendungsszenarien haben, versuchen Sie es mit dem opa
-Plugin, das auf programmierbare Weise leistungsfähigere Funktionen ermöglicht.
Apache APISIX arbeitet derzeit auch an zusätzlichen Plugins, um die Integration weiterer Dienste zu unterstützen. Wenn Sie interessiert sind, können Sie gerne eine Diskussion in GitHub Discussion starten oder über die Mailingliste kommunizieren.