webentwicklung-frage-antwort-db.com.de

Wie integriere ich OAuth mit einer einseitigen Anwendung?

Bei Verwendung von OAuth (2) Ich benötige in meiner Anwendung einen Umleitungsendpunkt, zu dem der OAuth-Dienst umleiten kann, sobald ich authentifiziert wurde.

Wie gehe ich in einer einseitigen Anwendung damit um? Natürlich ist eine Weiterleitung zum OAuth-Dienst hier nicht nett, und es ist möglicherweise nicht einmal möglich, eine Rückleitung durchzuführen.

Ich weiß, dass OAuth auch eine auf Benutzernamen/Passwort basierende Token - Generierung unterstützt. Dies funktioniert perfekt mit einem AJAX - Aufruf, erfordert jedoch, dass meine Anwendung für eine einzelne Seite nach einem fragt Benutzername und Passwort.

Wie gehst du normalerweise damit um?

44
Golo Roden

Meistens ist eine Weiterleitung auch für SPA in Ordnung, da Benutzer ihre X-Dienstanmeldeinformationen nicht auf einer anderen Website als X ablegen möchten. Eine Alternative ist die Verwendung eines kleinen Popup-Fensters. Sie können überprüfen, was Diskurs tut. IMHO ist eine Umleitung besser als ein Popup.

Google Einige Anbieter unterstützen den Ressourceninhaberfluss , den Sie als Senden von Benutzername und Kennwort beschrieben haben, aber das ist nicht nett. Das sind die Probleme, die ich sehe:

  1. Das Abfragen von Google-Anmeldeinformationen an Benutzer auf Ihrer Website ist für einige Benutzer nicht möglich.
  2. Die Flows der Ressourcenbesitzer benötigen auch client_secret. Dies ist etwas, das Sie NICHT in Ihr clientseitiges Javascript einfügen dürfen. Wenn Sie den Datenfluss des Ressourcenbesitzers von Ihrer serverseitigen Anwendung aus instanziieren und sich Ihre Anwendung nicht in derselben geografischen Region befindet wie der Benutzer, wird der Benutzer mit der Warnung "Hey, jemand versucht, mit Ihren Anmeldeinformationen aus Indien auf sie zuzugreifen" gewarnt.

OAuth beschreibt einen clientseitigen Fluss namens impliziter Fluss . Mit diesem Ablauf benötigen Sie keine Interaktion auf Ihrer Serverseite und das client_secret nicht. Der OAuth Anbieter leitet mit einem "# access_token = xx" zu Ihrer Anwendung weiter. Dies wird implizit genannt, da Sie den Berechtigungscode nicht austauschen müssen per = access token, Sie erhalten direkt ein access_token.

Google implementiert den impliziten Ablauf. Überprüfen Sie Folgendes: Verwenden von OAuth2 für clientseitige Apps .

Wenn Sie den impliziten Datenfluss mit einem Provider verwenden möchten, der ihn nicht unterstützt, wie z. B. Github, können Sie einen Authentifizierungsbroker wie Auth verwenden.

Haftungsausschluss: Ich arbeite für Auth0.

47

Was José F. Romaniello sagte ist richtig. Ihre Frage ist jedoch weit gefasst, und ich bin der Ansicht, dass die hier angebotenen Schlussfolgerungen nur allgemeine Aussagen sind.

Anwendungsstatus

Wenn Sie beispielsweise nicht wissen, wie komplex Ihr Anwendungsstatus zu dem Zeitpunkt ist, an dem Sie Ihre Benutzer anmelden möchten, kann niemand genau wissen, ob die Verwendung einer Umleitung überhaupt praktisch ist überhaupt. Bedenken Sie, dass Sie möglicherweise bereit sind, den Benutzer zu einem Zeitpunkt, an dem Ihre Anwendung den Status hat, dass Sie wirklich nicht ohne guten Grund serialisieren und speichern möchten, zu einem sehr späten Zeitpunkt bei der Verwendung des Workflows/der Anwendung anmelden zu lassen. Geschweige denn schreiben Sie Code, um es neu zu erstellen.

Hinweis: Sie werden viele Ratschläge finden, die Sie im Web einfach ignorieren können. Dies liegt daran, dass viele Benutzer den größten Teil ihres Anwendungszustands im serverseitigen Sitzungsspeicher und sehr wenig auf ihrem (Thin) Client speichern. Manchmal aus Versehen, manchmal ist es wirklich sinnvoll - stellen Sie sicher, dass es für Sie zutrifft, wenn Sie es ignorieren. Wenn Sie einen Thick-Client entwickeln, ist dies normalerweise nicht der Fall.

Popup-Dialoge

Mir ist klar, dass Popups wegen all ihrer Missbräuche einen schlechten Ruf im Web haben, aber man muss über gute Verwendungen nachdenken. In diesem Fall dienen sie genau den gleichen Zwecken wie vertrauenswürdige Dialogfelder in anderen Systemtypen (z. B. Windows UAC, fd.o polkit usw.). Diese Schnittstellen sind alle erkennbar und verwenden die Funktionen der zugrunde liegenden Plattform, um sicherzustellen, dass sie nicht gefälscht werden können und dass Eingaben oder Anzeigen nicht von der nicht privilegierten Anwendung abgefangen werden können. Die genaue Parallele ist, dass der Browser chrome und insbesondere das Zertifikat-Vorhängeschloss nicht gefälscht werden können und dass die Single-Origin-Richtlinie verhindert, dass die Anwendung auf das DOM des Popups zugreift ) und die Anwendung kann mit dokumentübergreifende Nachrichtenübermittlung oder andere Techniken erfolgen.

Dies ist wahrscheinlich der optimale Weg, zumindest bis die Browser die Berechtigung für Berechtigungen standardisieren, falls sie dies jemals tun. Selbst dann passen Autorisierungsprozesse für bestimmte Ressourcenanbieter möglicherweise nicht zu standardisierten Vorgehensweisen, sodass flexible benutzerdefinierte Dialoge, wie wir sie heute sehen, möglicherweise nur erforderlich sind.

Übergänge im selben Fenster

In diesem Sinne ist es wahr, dass die Ästhetik hinter einem Popup subjektiv ist. In Zukunft werden Browser möglicherweise APIs bereitstellen, mit denen ein Dokument in ein vorhandenes Fenster geladen werden kann, ohne das vorhandene Dokument zu entladen. Anschließend kann das neue Dokument das vorherige Dokument entladen und wiederherstellen. Ob die "versteckte" Anwendung weiter ausgeführt wird oder eingefroren ist (ähnlich wie Virtualisierungstechnologien Prozesse einfrieren können), ist eine weitere Debatte. Dies würde das gleiche Verfahren wie bei Popups ermöglichen. Es gibt keinen mir bekannten Vorschlag, dies zu tun.

Hinweis: Sie können dies simulieren, indem Sie Ihren gesamten Anwendungsstatus auf einfache Weise serialisierbar machen und eine Prozedur verwenden, mit der er im lokalen Speicher (oder auf einem Remoteserver) gespeichert und von dort wiederhergestellt wird. Sie können dann Old-School-Umleitungen verwenden. Wie am Anfang angedeutet, kann dies den Anwendungscode sehr stark beeinträchtigen.

Tabs

Eine weitere Alternative besteht natürlich darin, stattdessen einen neuen Tab zu öffnen, mit ihm genau wie mit einem Popup zu kommunizieren und ihn dann auf dieselbe Weise zu schließen.

Beim Übernehmen von Benutzeranmeldeinformationen aus der nicht privilegierten Anwendung

Natürlich kann es nur funktionieren, wenn Ihre Benutzer Ihnen genug vertrauen, um die Anmeldeinformationen nicht an Ihren Server zu senden (oder an einen Ort, an dem sie nicht möchten, dass sie enden). Wenn Sie Ihren Code als Open-Source-Version veröffentlichen und deterministische Builds/Minimierungen durchführen, können Benutzer den Code theoretisch prüfen oder von einer anderen Person prüfen lassen. Anschließend wird automatisch überprüft, ob Sie die Laufzeitversion nicht manipuliert haben, um so das Vertrauen der Benutzer zu gewinnen. Tooling, um dies im Web zu tun, ist nicht vorhanden AFAIK.

Abgesehen davon möchten Sie manchmal OAuth mit einem Identitätsanbieter unter Ihrer Kontrolle/Autorität/Marke verwenden. In diesem Fall ist die gesamte Diskussion umstritten - der Benutzer vertraut Ihnen bereits.

Fazit

Am Ende kommt es darauf an, (1) wie dick Ihr Client ist und (2) wie die UX aussehen soll.

21
tne

OAuth2 verfügt über 4 Flow-Zuweisungstypen, die jeweils einem bestimmten Zweck dienen:

  • Autorisierungscode (derjenige, auf den Sie angespielt haben und der umgeleitet werden muss)
  • Implizit
  • Client-Berechtigungsnachweis
  • Berechtigungsnachweis für das Kennwort des Ressourcenbesitzers

Die kurze Antwort lautet: Impliziten Fluss verwenden.

Warum? Die Auswahl eines Flow- oder Grant-Typs hängt davon ab, ob ein Teil Ihres Codes privat bleiben kann, und kann daher einen geheimen Schlüssel speichern. In diesem Fall können Sie den sichersten OAuth2-Fluss auswählen - Authorization Code. Andernfalls müssen Sie Kompromisse bei einem weniger sicheren OAuth2-Fluss eingehen. für eine einseitige Anwendung (SPA) ist dies beispielsweise Implicit flow.

Der Client Credential - Fluss funktioniert nur, wenn der Webdienst und der Benutzer dieselbe Entität sind, dh, der Webdienst dient nur diesem bestimmten Benutzer, während der Resource Owner Password Credential - Fluss am wenigsten sicher ist und als letzter Ausweg seit dem verwendet wird Der Benutzer muss seine Anmeldeinformationen für soziale Netzwerke für den Dienst eingeben.

Um den Unterschied zwischen dem empfohlenen Fluss Implicit und dem Fluss Authorization Code (Auf den Sie angespielt haben und der umgeleitet werden muss) vollständig zu verstehen, schauen Sie sich den Fluss nebeneinander an:

Comparing 'Implicit' and 'Authorization Code' flow side-by-side

Dieses Diagramm wurde entnommen aus: https://blog.oauth.io/introduction-oauth2-flow-diagrams/

1
nethsix