it-swarm.com.de

Umgang mit abgelaufenen Zugriffstoken in impliziter OAuth2-Gewährung

Die Spezifikation von OAuth2 besagt, dass ein Berechtigungsserver bei Verwendung der impliziten Erteilung kein Aktualisierungstoken ausgeben darf. In unserem Anwendungsfall schützen wir eine RESTful-API mit OAuth2 und verwenden eine Single Page Javascript-Anwendung als Client für diese API. Da es sehr schwierig ist, nach Ablauf eines Zugriffstokens auf den Autorisierungsserver umzuleiten, suchen wir nach einem besseren Weg, um ein neues gültiges Token zu erhalten. Ich könnte über zwei verschiedene Ansätze nachdenken und mich fragen, welcher besser sein könnte:

  1. Verwenden Sie einen ausgeblendeten Iframe, um ein gültiges Zugriffstoken erneut anzufordern. Dazu muss ein Parameter wie „Prompt = none“ angegeben werden, der den OAuth-Anbieter anweist, weder die Authentifizierung anzufordern noch eine Autorisierungsseite anzuzeigen. Wenn der Benutzer authentifiziert ist und die Anwendung autorisiert hat, sendet der Server ein Zugriffstoken in den urls # -Parametern zurück. Wenn eine der vorherigen Bedingungen nicht erfüllt ist, wird die Weiterleitung mit einem Fehler wie # error = authentication% 20lost ausgeführt. Mit diesem Verhalten können wir kurzlebige Zugriffstoken auch mit einem impliziten Fluss verwenden.

  2. Wir könnten einen zusätzlichen Bereich (z. B. offline) verwenden, der den Server auffordert, ein Aktualisierungstoken auszuhändigen. Selbst wenn die ursprüngliche Spezifikation besagt, dass impliziter Datenfluss keine Aktualisierungstoken ausgibt (was richtig ist, wenn der Client OAuth nur für eine Erstautorisierung verwendet), können Sie Ihre eigenen Bereiche für Ihre bestimmte Anwendung definieren. Sie sollten in Betracht ziehen, diesen Bereich nur von bekannten Clients zuzulassen.

Beide Ansätze sind denen von OpenID Connect sehr ähnlich. Leider gibt es momentan nicht viele Implementierungen von OpenID Connect. Der erste Schritt wäre also, den OAuth2-Server zu erweitern, bis OIC populärer wird.

Welcher Ansatz sollte also bevorzugt werden?

EDIT: Der Token-Endpunkt benötigt eine Client-Authentifizierung, die nur für vertrauliche Clients wie serverseitige Anwendungen möglich ist. Mit dem zweiten Ansatz wäre es in unserem Fall nur möglich, die RESTful-API dem Ressourcenanbieter zu überlassen, das Token zu aktualisieren und an den Client zurückzusenden. Ich denke, das wäre ein Sicherheitsrisiko. Wir haben also wahrscheinlich nur einen gültigen Ansatz.

26

Ich versuche im Moment genau dasselbe zu erreichen.

Ich habe tatsächlich den hidden iframe - Ansatz implementiert und dann festgestellt, dass Sie mit iframes sehr vorsichtig sein müssen. Jede böswillige Website kann Ihren Iframe enthalten und leicht Zugriffstoken erhalten, wenn Sie nicht X-Frame-Optionen angeben.

Der beste Ansatz für Refreshing Token sollte Password Grant laut Spezifikation sein. (Ich wollte, dass sich meine Benutzer mit ihrem Facebook-Konto anmelden. Der implizite Datenfluss war einfacher zu entwickeln. Ich habe noch nicht genau herausgefunden, wie dies mit der Kennwortgewährung geschehen soll.)

Der zweite Ansatz kam mir ebenfalls in den Sinn und scheint mir viel sicherer als der erste, da Sie normalerweise dem https & Browser-Speicher vertrauen können, um Ihre Token geheim zu halten.

Bearbeiten

Ich habe festgestellt, dass die meisten Browser auch mit X-Frame-Options keine Weiterleitungen verhindern können, da dieser Header an den Antworttext angehängt wird und die umgeleitete URL verfügbar gemacht wird, sodass Zugriffstoken verfügbar gemacht werden.

Update Es sieht so aus, als ob das Hash-Fragment vom Browser geschützt wird, wenn von der übergeordneten Seite in einer anderen Domäne aus darauf zugegriffen wird. Ich gehe also davon aus, dass #access_token sicher ist. Mein Fehler. So wie eine Erinnerungs-Callback-Seite das Zugriffstoken für sich selbst speichern muss, anstatt es (meine ursprüngliche Absicht) an die übergeordnete Seite zu delegieren, wie window.parent.storeAccessToken(hash);, was offensichtlich eine dumme Sache ist.

3
beku8

Von der OAuth0-Website :

Wenn Sie Ihre Benutzer ohne Anmeldeseite authentifizieren müssen (z. B. wenn der Benutzer bereits über ein SSO-Szenario angemeldet ist) oder ein neues access_token erhalten müssen (also das Aktualisieren eines abgelaufenen Tokens simulieren), können Sie die automatische Authentifizierung verwenden.

Wie für die Stille Authentifizierung :

Das Umleiten von Benutzern von Ihrer Anwendung weg wird normalerweise als störend angesehen und sollte aus UX-Sicht vermieden werden. Mit der automatischen Authentifizierung können Sie einen Authentifizierungsablauf ausführen, bei dem Auth0 nur mit Umleitungen und niemals mit einer Anmeldeseite antwortet.

Auf diese Weise können Sie den Benutzer mit einem SSO-Token zurückmelden, ohne ihn erneut zur Eingabe von Anmeldeinformationen auffordern zu müssen.

0
Nathan