Ich bin dabei, 3 Komponenten zu entwerfen, die in Symphonie miteinander arbeiten:
- Ein RESTful-Webdienst, der
BasicAuth
bei allen Anrufen über HTTPS erfordert und der tatsächlich das ganze schwere Heben für mein System erledigt (erledigt die Arbeit). - Eine Web-Benutzeroberfläche, die Endbenutzeraktionen in API-Aufrufe an den oben genannten Webdienst übersetzt. Daher wird die Benutzeroberfläche vom WS "unterstützt"
- Ein CLI-Tool (Command Line Interface), das Entwickler lokal installieren und ausführen können und das Befehle auch in API-Aufrufe an das WS übersetzt (daher wird es auch vom WS "unterstützt").
Eine der ersten Hürden, die ich zu überwinden versuche, betrifft die Authentifizierung und Autorisierung.
Stellen wir uns vor, der WS verwendet einen LDAP / Verzeichnisdienst (wie AD oder vielleicht Apache DS) als Authentifizierungsbereich. Das heißt, wenn ein API-Aufruf über die Leitung eingeht (z. B. HTTPS GET
für eine Ressource), werden die BasicAuth
Anmeldeinformationen aus der Anforderung extrahiert und an den LDAP-Dienst weitergeleitet, um festzustellen, ob dies ein gültiger Benutzer ist oder nicht. Wenn sie authentifiziert sind, nehmen wir an, dass ein separater Autorisierungsbereich, möglicherweise eine Datenbank, verwendet wird, um zu bestimmen, ob der identifizierte Benutzer das tun kann, was er in der HTTPS-Anforderung versucht. So weit, ist es gut.
Im Fall des CLI-Tools muss sich der Benutzer vor dem Ausführen von Befehlen authentifizieren. Daher funktioniert dieses Modell einwandfrei, da ein einzelner Benutzer immer nur dieselbe CLI-Instanz zu einem bestimmten Zeitpunkt ausführt.
Das Problem tritt auf, wenn wir versuchen, die Web-App (UI) in das WS zu integrieren, da viele Personen gleichzeitig an der App angemeldet sein können und alle unterschiedliche Berechtigungen haben, die bestimmen, welche zugrunde liegenden API-Aufrufe sie ausführen dürfen.
Soweit ich es sehe, es sieht aus wie ich habe aber 4 Möglichkeiten:
- Zwischengespeicherte Anmeldeinformationen : Nach dem Anmelden bei der App werden die Anmeldeinformationen irgendwo zwischengespeichert (sodass die App Zugriff darauf hat), und die App erzwingt selbst keine Autorisierungsrichtlinie. Wenn Benutzer versuchen, API-Aufrufe unter der Haube zu generieren, werden ihre Anmeldeinformationen aus dem Cache abgerufen und mit den API-Aufrufen weitergeleitet. Wenn der WS feststellt, dass er nicht autorisiert ist, sendet er einen Fehler zurück.
- Service-Level-Konten : Die App und der WS verwenden beide dieselben Authentifizierungs- / Autorisierungsbereiche, außer dass die Web-Benutzeroberfläche jetzt die Autorisierung für das erzwingt, was Benutzer tatsächlich in der App sehen und tun können. Wenn sie etwas tun dürfen, das einen zugrunde liegenden API-Aufruf generiert, sendet die App
myapp-admin-user
bei jedem API-Aufruf im Namen des Benutzers Anmeldeinformationen für das Dienstkonto (z. B. ). - OAuthv2 : Ich habe keine Ahnung, was OAuth ist oder ob es für dieses Szenario anwendbar ist, aber ich denke , es könnte hier irgendwie eine Lösung sein.
- Tokenserver : Verwenden Sie einen Tokenserver wie CAS oder Kerberos, um für Benutzer zu bürgen, ähnlich wie sich die Option Konto auf Serviceebene verhält. Wenn sich ein Benutzer erfolgreich bei der App anmeldet, sendet der Tokenserver der App eine Sitzungs-UUID zurück und registriert diese UUID auch beim WS. Jedes Mal, wenn die App einen API-Aufruf generiert, wird die UUID an die Anforderung angeheftet, die dann auf der WS-Seite überprüft wird.
Die Option " Zwischengespeicherte Anmeldeinformationen " fühlt sich einfach wie eine Abweichung von allem an, was im Sicherheitsland gut und gesund ist. Es fühlt sich einfach falsch an, Anmeldeinformationen überall und jederzeit zwischenzuspeichern.
Die „ Token Server “ Option scheint für einen SSO Typ Setup, aber nicht in diesem speziellen Fall gültig und fühlt sich mir peinlich. Ich denke auch, dass es keine gute Möglichkeit gibt, das Sitzungs-UUID-Konzept und BasicAuth
/ HTTPS gleichzeitig zu verwenden.
Damit bleibt OAuthv2, von dem ich nichts weiß, und " Service-Level-Konto (SLA) * " als einzige verbleibende Option übrig. Die SLA-Option scheint in Ordnung zu sein, weist jedoch einige folgende Nachteile auf:
- Es erfordert, dass das Dienstkonto grundsätzlich "Gottprivilegien" über das WS hat. Mit anderen Worten, sobald die App der Ansicht ist, dass ein Benutzer auf eine Schaltfläche klicken oder etwas in der Benutzeroberfläche tun darf, führt dies zu einem bedingungslosen API-Aufruf des von der Benutzeroberfläche verwendeten Dienstkontos. Das fühlt sich einfach schlecht an, mkay?
- Mir fällt ein, dass das Verwalten von zwei Berechtigungssätzen (der Berechtigungssatz für jeden Benutzer der App und dann der Berechtigungssatz für das von der App für das WS verwendete Dienstkonto) dazu führen kann, dass die Berechtigungen nicht mehr miteinander synchronisiert werden irgendwie
Es scheint also, dass ich hier keine wirklich guten Optionen habe. Sicherlich kann ich nicht der erste Entwickler sein, der darauf stößt, aber die Frage nach den Google-Göttern hat mir hier nicht viel geholfen. Irgendwelche Ideen?