webentwicklung-frage-antwort-db.com.de

Warum verfallen Zugriffstoken?

Ich fange gerade erst an, mit Google API und OAuth2 zu arbeiten. Wenn der Client meine App autorisiert, erhalte ich ein "Aktualisierungstoken" und ein kurzlebiges "Zugriffstoken". Jetzt kann ich jedes Mal, wenn das Zugriffstoken abläuft, POST= mein Aktualisierungstoken an Google senden, und sie geben mir ein neues Zugriffstoken.

Meine Frage ist, wofür läuft das Zugriffstoken ab? Warum kann es nicht einfach ein dauerhaftes Zugriffstoken anstelle des Aktualisierungstokens geben?

Läuft das Aktualisierungstoken auch ab?

Weitere Informationen zum Google OAuth2-Workflow finden Sie unter Verwenden von OAuth 2.0, um auf Google-APIs zuzugreifen .

204
levi

Dies ist sehr implementierungsspezifisch, aber die allgemeine Idee besteht darin, Anbietern die Ausgabe von kurzfristigen Zugriffstoken mit langfristigen Aktualisierungstoken zu ermöglichen. Warum?

  • Viele Anbieter unterstützen Inhaber-Token, die in Bezug auf die Sicherheit sehr schwach sind. Indem sie kurzlebig sind und eine Aktualisierung erfordern, begrenzen sie die Zeit, in der ein Angreifer ein gestohlenes Token missbrauchen kann.
  • Bei einer umfangreichen Bereitstellung soll nicht bei jedem API-Aufruf eine Datenbanksuche durchgeführt werden. Stattdessen wird ein selbstverschlüsseltes Zugriffstoken ausgegeben, das durch Entschlüsselung überprüft werden kann. Dies bedeutet jedoch auch, dass es keine Möglichkeit gibt, diese Token zu widerrufen, sodass sie für kurze Zeit ausgegeben werden und aktualisiert werden müssen.
  • Das Aktualisierungstoken erfordert eine Clientauthentifizierung, die es stärker macht. Im Gegensatz zu den oben genannten Zugriffstoken wird sie normalerweise mit einer Datenbanksuche implementiert.
220
Eran Hammer

Einige Szenarien veranschaulichen möglicherweise den Zweck des Zugriffs auf und der Aktualisierung von Token sowie die technischen Nachteile beim Entwurf eines oauth2-Systems (oder eines anderen auth-Systems):

Web-App-Szenario

Im Web-App-Szenario stehen Ihnen mehrere Optionen zur Verfügung:

  1. wenn Sie über eine eigene Sitzungsverwaltung verfügen, speichern Sie das access_token und das refresh_token für Ihre Sitzungs-ID im Sitzungsstatus auf Ihrem Sitzungsstatusdienst. Wenn der Benutzer eine Seite anfordert, für die Sie auf die Ressource zugreifen müssen, verwenden Sie das access_token. Wenn das access_token abgelaufen ist, verwenden Sie das refresh_token, um das neue zu erhalten.

Stellen wir uns vor, jemand schafft es, Ihre Sitzung zu hijacken. Das Einzige, was möglich ist, ist, Ihre Seiten anzufordern.

  1. wenn Sie keine Sitzungsverwaltung haben, setzen Sie das access_token in ein Cookie und verwenden Sie es als Sitzung. Wenn der Benutzer dann Seiten von Ihrem Webserver anfordert, senden Sie das access_token. Ihr App-Server kann das access_token bei Bedarf aktualisieren.

Vergleich von 1 und 2:

In 1 werden access_token und refresh_token nur über die Leitung zwischen dem Authorisierungsserver (in Ihrem Fall Google) und Ihrem App-Server übertragen. Dies würde auf einem sicheren Kanal erfolgen. Ein Hacker könnte die Sitzung hijacken, aber nur mit Ihrer Web-App interagieren. In 2 könnte der Hacker das access_token entfernen und seine eigenen Anfragen an die Ressourcen stellen, auf die der Benutzer Zugriff gewährt hat. Selbst wenn der Hacker Zugriff auf das access_token erhält, hat er nur ein kurzes Fenster, in dem er auf die Ressourcen zugreifen kann.

In beiden Fällen sind das refresh_token und die clientid/secret nur dem Server bekannt, sodass über den Webbrowser kein langfristiger Zugriff möglich ist.

Stellen wir uns vor, Sie implementieren oauth2 und legen eine lange Zeitüberschreitung für das Zugriffstoken fest:

1) Es gibt hier keinen großen Unterschied zwischen einem kurzen und einem langen Zugriffstoken, da dieser auf dem App-Server verborgen ist. In 2) könnte jemand das access_token im Browser erhalten und es dann verwenden, um für eine lange Zeit direkt auf die Ressourcen des Benutzers zuzugreifen.

Mobiles Szenario

Auf dem Handy gibt es einige mir bekannte Szenarien:

  1. Speichern Sie clientid/secret auf dem Gerät und lassen Sie das Gerät orchestrieren, um Zugriff auf die Ressourcen des Benutzers zu erhalten.

  2. Verwenden Sie einen Back-End-App-Server, um die Client-ID/das Geheimnis zu bewahren und die Orchestrierung durchführen zu lassen. Verwenden Sie das access_token als eine Art Sitzungsschlüssel und übergeben Sie es zwischen dem Client und dem App-Server.

Vergleich von 1 und 2

In 1) Sobald Sie clientid/secret auf dem Gerät haben, sind sie nicht mehr geheim. Jeder kann mit Erlaubnis des Benutzers dekompilieren und dann so handeln, als ob er Sie wären. Das access_token und das refresh_token befinden sich ebenfalls im Speicher und können über ein kompromittiertes Gerät aufgerufen werden. Dies bedeutet, dass jemand als Ihre App fungieren kann, ohne dass der Benutzer seine Anmeldeinformationen angibt. In diesem Szenario spielt die Länge des access_token keine Rolle für die Hackbarkeit, da refresh_token sich an derselben Stelle befindet wie access_token. In 2) sind die Client-ID/das Geheimnis und das Aktualisierungstoken kompromittiert. Dabei bestimmt die Länge des access_token-Ablaufs, wie lange ein Hacker auf die Ressourcen des Benutzers zugreifen kann, wenn er darauf zugreifen kann.

Ablauflängen

Hier kommt es darauf an, was Sie mit Ihrem Authentifizierungssystem sichern, wie lange Ihr access_token-Ablauf sein soll. Wenn es für den Benutzer etwas besonders Wertvolles ist, sollte es kurz sein. Etwas weniger wertvoll, kann es länger sein.

Einige Leute wie Google lassen das refresh_token nicht ablaufen. Manche mögen Stackflow. Die Entscheidung über den Ablauf ist ein Kompromiss zwischen Benutzerfreundlichkeit und Sicherheit. Die Länge des Aktualisierungstokens hängt von der Länge der Benutzerrückgabe ab, d. H. Legen Sie für die Aktualisierung fest, wie oft der Benutzer zu Ihrer App zurückkehrt. Wenn das Aktualisierungstoken nicht abläuft, kann es nur durch einen expliziten Widerruf widerrufen werden. Normalerweise würde eine Anmeldung nicht widerrufen.

Hoffe, dass eher langer Beitrag sinnvoll ist.

30
Ed Sykes

Zusätzlich zu den anderen Antworten:

Nach dem Erhalt werden Zugriffstoken normalerweise zusammen mit jeder Anforderung von Clients an geschützte Ressourcenserver gesendet. Dies birgt das Risiko des Diebstahls und der Wiederholung von Zugriffstoken (vorausgesetzt natürlich, dass die Zugriffstoken vom Typ "Bearer" sind (wie in der anfänglichen RFC6750 definiert).

Beispiele für diese Risiken im wirklichen Leben:

  • Ressourcenserver sind im Allgemeinen verteilte Anwendungsserver und weisen im Vergleich zu Autorisierungsservern in der Regel niedrigere Sicherheitsstufen auf (niedrigere SSL/TLS-Konfiguration, weniger Hardening usw.). Autorisierungsserver hingegen werden in der Regel als kritische Sicherheitsinfrastruktur betrachtet und sind einer stärkeren Absicherung ausgesetzt.

  • Zugriffstoken werden möglicherweise in HTTP-Traces, Protokollen usw. angezeigt, die zu Diagnosezwecken auf den Ressourcenservern oder -clients ordnungsgemäß erfasst werden. Diese Spuren können über öffentliche oder halböffentliche Orte (Bug Tracer, Service Desk usw.) ausgetauscht werden.

  • Backend-RS-Anwendungen können an mehr oder weniger vertrauenswürdige Dritte ausgelagert werden.

Das Auffrischtoken wird dagegen normalerweise nur zweimal über die Leitungen und immer zwischen dem Client und dem Autorisierungsserver übertragen: einmal, wenn es vom Client bezogen wird, und einmal bei Verwendung durch den Client während der Aktualisierung (wobei das vorherige Aktualisierungstoken effektiv "abläuft"). Dies ist eine drastisch begrenzte Gelegenheit zum Abfangen und Wiederholen.

Letzte Überlegung: Refresh-Token bieten, wenn überhaupt, nur sehr geringen Schutz vor kompromittierten Clients.

9
Guillaume

Es ist im Wesentlichen eine Sicherheitsmaßnahme. Wenn Ihre App kompromittiert ist, hat der Angreifer nur Zugriff auf das kurzlebige Zugriffstoken und kann kein neues generieren.

Refresh-Token laufen ebenfalls ab, es wird jedoch davon ausgegangen, dass sie viel länger als der Zugriffstoken gültig sind.

9