HTTP-Proxy mit Autorisierungsprüfung im Übungssystem

Autor: Immo Schulz-Gerlach, ZMI, FernUni-Hagen.de
Version: 0.3 – 05.09.2017
[PDF-Version] [ePub-Version]

Einleitung

Grundlegende Funktionalität

Das Online-Übungssystem bietet einen HTTP-Proxy-Service mit folgenden Eigenschaften:

D.h. es können HTTP-Requests, die eigentlich von einem Übungssystem-externen (FernUni-)Server bearbeitet werden sollen, durchs Übungssystem durchgeschleift werden, wobei das Übungssystem zunächst eine Authentifizierung des Aufrufers durchführt und den Request nur bei erfolgreicher Autorisierungsprüfung an den externen Server weiterleitet.

Haupteinsatzzweck ist also die Ausnutzung der bereits im Online-Übungssystem bestehenden Autorisierungfunktionalität für externe Dienste, die sich auf diese Weise nicht selbst um die Autorisierung ihrer Nutzer kümmern müssen. Damit externe Aufrufer diese Autorisierungsprüfung nicht einfach umgehen können, indem sie den Zielserver direkt statt übers Übungssystem ansprechen, sieht der typische Anwendungsfall vor, dass der anzusprechende Server nur innerhalb des FernUni-Netzwerkes und nicht direkt aus dem Internet erreichbar ist (z.B. durch Firewall-Regeln).

Zusätzlich übermittelt das Übungssystem noch Informationen über den authentifizierten Nutzer (Username oder Matrikelnummer) sowie den Autorisierungskontext (Übungssystem-Kurs, den der angemeldete Benutzer belegt hat bzw. betreut oder dessen Einsendearbeiten er korrigiert) an das Zielsystem, die dieses bei Bedarf berücksichtigen kann.

Einsatz-Szenario

Ein möglicher Anwendungsfall dieses Proxys lässt sich wie folgt skizzieren:

In diesem Beispiel kann der Übungssystem-Autorisierungs-Proxy im „Studenten-Modus“ zum Einsatz kommen:

Abgrenzung zu SOAP-Vorkorrekturmodulen

Mit Vorkorrekturmodulen gibt es bereits einen Mechanismus, über den externe Software an das Online-Übungssystem angebunden werden kann. Die Anwendung von Vorkorrekturmodulen unterscheidet sich jedoch erheblich von der dieses Proxys:

Vorkorrekturmodule sind nicht mit Blick auf interaktive Aufgabenbearbeitung in mehreren Schritten ausgelegt worden, sondern ihr primäres Einsatzgebiet ist das Feedback nach einer in gewissem Sinne „fertigen“ Einsendung. Durch Speicherung der Vorkorrekturen sind die Ergebnisse auch nicht „flüchtig“, sondern können auch später im Rahmen einer Korrektur immer wieder eingesehen werden (vom Studenten oder auch von einem menschlichen Korrektor, der eine endgültige Korrektur und Bewertung vornehmen soll).

Man kann zwar Vorkorrekturmodule auch für Ajax-Requests wie oben skizziert „zweckentfremden“, das birgt aber gegenüber der Proxy-Lösung einige potentielle Nachteile. Insbesondere ist deutlich höherer Zeitbedarf für die Requestbearbeitung einzukalkulieren, bedingt durch Datenbankzugriffe, Bildung und Ausführung eines SOAP-Requests, Ausfüllen einer Korrektuschablone etc. Die Speicherung der Daten kann andererseits in gewissen Anwendungsfällen vielleicht auch ein Vorteil sein, weil so bei Unterbrechen einer interaktiven Aufgabenbearbeitung und später erneutem Aufruf ggf. ein Wiedereinstieg beim letzten Bearbeitungsschritt realisierbar ist.

Ist eine Speicherung der Teileinsendungen dagegen nicht nötig, ist die Verwendung des Proxys einfacher und schneller. Weiterhin erschließt der Proxy zusätzliche Einsatzbereiche, indem sein Autorisierungsmechanismus nicht auf Studenten/Kursbeleger eingeschränkt ist, sondern alternativ auch für Korrektoren oder Betreuer eines Übungssystem-Kurses eingesetzt werden kann. So wäre z.B. die Nutzung bestimmter Serveranwendungen für Korrektoren zu deren Unterstützung bei der Aufgabenkorrektur denkbar.

Einschränkungen


Verwendung

Im Unterschied zu „gewöhnlichen“ HTTP-Proxy-Servern ist hier kein Request mit Original-URL lediglich an eine IP eines Proxy-Servers zu senden, sondern zunächst ein regulärer Requests ans Online-Übungssystem zu stellen, mit einem übungssystemspezifischen URL, aus dem die für die Autorisierungprüfung benötigten Informationen entnommen werden. Der Ziel-URL ist dem Übungssystem zusätzlich zu übermitteln. Der Request wird dann (leicht modifiziert) an den Zielserver weitergeleitet, sofern die Autorisierungsprüfung zuvor erfolgreich war.

URL

Der URL hat zunächst den Standard-Aufbau von URLs im Kurskontext mit einem speziellen Servicenamen und dem Schlüssel (Veranstaltername, Kursnummer, Versionsnummer/Semester) des Kurses, für den die Autorisierungsprüfung vorgenommen werden soll. Aus dem Servicenamen geht weiterhin die Art der Autorisierungsprüfung hervor (d.h. ob der Aufrufer ein Beleger, Korrektor oder Betreuer des Kurses sein muss, um den Dienst aufrufen zu dürfen). Der Ziel-URL, an den der Request weiterzuleiten ist, wird als Suffix an den URL angehängt.

Der URL hat also folgenden Aufbau (in RegEx-Syntax2):

https://online-uebungssystem.fernuni-hagen.de⤦
/<veranstaltername>/(Student|Betreuer|Korrektor)?AuthProxy/<kursnr>/<versionsnr>⤦
/https?://<Ziel-Domain>:(<Port>)?(/<Path>)?(\?<QueryString>)?

Die Abschnitte in spitzen Klammern sind Platzhalter, die mit konkreten Werten zu füllen sind:

Beispiele:

HTTP-Methods

Unterstützt werden derzeit lediglich GET, POST und PUT.3

HTTP-Header

HTTP-Auth

Die Anfrage muss – wie alle Anfragen ans Online-Übungssystem – einen Authorization-Header für Basic-Authentication (aka HTTP-Auth) enthalten, andernfalls lehnt das Übungssystem die Anfrage mit Response Code 401 (Unauthorized) ab.
(Aufbau des Headers: Authorization: Basic <base64(username:password)>)

Nur wenn die so übergebenen Credentials einen Studenten, Korrektor bzw. Betreuer authentifizieren und dieser zum Zugriff auf den Kurs autorisiert ist, wird die Anfrage an die Remote-URL weitergeleitet, andernfalls antwortet der Übungssystem-Server entweder mit 401 oder 403 (abhängig davon, ob eine neue Passworteingabe angefordert werden soll oder ob die Credentials zwar einen User authentifizieren, dieser aber keine Autorisierung hat).

Der Authorization-Header wird nicht ans Zielsystem weitergeleitet, sondern vom Übungssystem aus dem Request entfernt.

X-Header

Statt des Authorization-Headers werden neue, nicht im HTTP-Standard definierte Header in den Request ans Zielsystem eingebunden:

Sonstige Header

Die meisten Header werden ansonsten 1:1 ans Zielsystem weitergereicht, nur „Hop-by-Hop“-Header4 werden ausgefiltert. Außerdem wird natürlich der Host-Header ausgetauscht gegen den Domainnamen (bzw. die IP) aus dem Target-URL.

HTTP-Body

Der Message Body sowohl von Requests (POST oder PUT) als auch von Responses (alle Methods) wird unverändert übertragen, also insbesondere vom Übungssystem weder interpretiert noch manipuliert.


  1. Bei Bedarf ließe sich ggf. eine Erweiterung implementieren, nach welcher bei Vorliegen von gesonderten Proxy-Authorization-Headern zusätzlich zu „normalen“ Authorization-Headern im Request das Übungssystem nur die Proxy-Authorization auswertet und Authorization-Header dann ans Zielsystem weiterleitet.  ↩

  2. Syntax regulärer Ausdrücke. Insbesondere steht \? für ein Fragezeichen im URL, während ? anzeigt, dass das vorhergehende einzelne Zeichen bzw. der Inhalt der vorhergehenden Klammern optional ist. Ein Pipe (|) ist ein Oder-Operator, Trennzeichen für eine Aufzählung von Alternativen (i.d.R. ebenfalls in runden Klammern).  ↩

  3. Bei Bedarf lässt sich ggf. der Support auch für andere Methoden wie insb. DELETE nachrüsten.  ↩

  4. Header, die laut HTTP/1.1-Standard nur an den nächsten, direkt angesprochenen Host übermittelt und insb. von Proxies nicht weitergeleitet werden. Siehe RFC2616 Sec. 13.5.1  ↩