JWT-Aktualisierungstokenfluss

128

Ich erstelle eine mobile App und verwende JWT zur Authentifizierung.

Der beste Weg, dies zu tun, scheint darin zu bestehen, das JWT-Zugriffstoken mit einem Aktualisierungstoken zu koppeln, damit ich das Zugriffstoken so oft ablaufen kann, wie ich möchte.

  1. Wie sieht ein Aktualisierungstoken aus? Ist es eine zufällige Zeichenfolge? Ist diese Zeichenfolge verschlüsselt? Ist es ein anderes JWT?
  2. Das Aktualisierungstoken würde für den Zugriff in der Datenbank des Benutzermodells gespeichert, richtig? Es scheint, als sollte es in diesem Fall verschlüsselt werden
  3. Würde ich das Aktualisierungstoken nach einer Benutzeranmeldung zurücksenden und den Client dann auf eine separate Route zugreifen lassen, um ein Zugriffstoken abzurufen?
jtmarmon
quelle
3
Hinweis: Wenn Sie Aktualisierungstoken verwenden, sollten Sie Benutzern die Möglichkeit bieten, diese auf der Benutzeroberfläche ungültig zu machen. Es wird auch empfohlen, sie automatisch abzulaufen, wenn sie beispielsweise einen Monat lang nicht verwendet werden.
Vilmantas Baranauskas
1
@jtmarmon: Wie speichert man das Aktualisierungstoken auf der Clientseite? Ich meine das Android-Gerät mit Sicherheit?
10.

Antworten:

39

Angenommen, es handelt sich um OAuth 2.0, da es sich um JWTs und Aktualisierungstoken handelt ...:

  1. Genau wie ein Zugriffstoken kann ein Aktualisierungstoken im Prinzip alles sein, einschließlich aller von Ihnen beschriebenen Optionen. Ein JWT kann verwendet werden, wenn der Autorisierungsserver zustandslos sein oder dem Client, der ihn präsentiert, eine Art "Proof-of-Besitz" -Semantik aufzwingen möchte. Beachten Sie, dass sich ein Aktualisierungstoken von einem Zugriffstoken dadurch unterscheidet, dass es nicht einem Ressourcenserver, sondern nur dem Autorisierungsserver präsentiert wird, der es ursprünglich ausgestellt hat, sodass die in sich geschlossene Validierungsoptimierung für JWTs als Zugriffstoken dies tut Nicht für Aktualisierungstoken halten

  2. das hängt von der Sicherheit / dem Zugriff der Datenbank ab; Wenn andere Parteien / Server / Anwendungen / Benutzer auf die Datenbank zugreifen können, dann ja (aber Ihr Kilometerstand kann variieren, je nachdem, wo und wie Sie den Verschlüsselungsschlüssel speichern ...)

  3. Ein Autorisierungsserver kann je nach der vom Client zum Abrufen verwendeten Berechtigung gleichzeitig Zugriffstoken und Aktualisierungstoken ausstellen. Die Spezifikation enthält die Details und Optionen zu jedem der standardisierten Zuschüsse

Hans Z.
quelle
31
2. Sie sollten einen Hash des Aktualisierungstokens in Ihrer Datenbank speichern und dann den Hash des Aktualisierungstokens des Benutzers mit Ihrem gespeicherten Hash vergleichen. Hier folgt die Regel "Speichern Sie keine Nur-Text-Passwörter in Ihrer Datenbank". Stellen Sie sich ein Token wie ein zufälliges Passwort vor, das Sie für den Benutzer erstellt haben.
Rohmer
2
Wenn Sie mehr Sicherheit bieten möchten, führen Sie auch eine Rotation des Aktualisierungstokens durch. Die Bedeutung davon ist bereits im ITEF RFC 6749 erwähnt . Bei korrekter Implementierung kann dies auch dazu beitragen, das Szenario des Token-Diebstahls zu identifizieren, dh das von einem Angreifer gestohlene Aktualisierungstoken. Wenn Sie nach einer besseren Erklärung suchen, gehen Sie zu diesem Link
Bhumil Sarvaiya
81

Im Folgenden finden Sie die Schritte zum Widerrufen Ihres JWT-Zugriffstokens:

  1. Wenn Sie sich anmelden, senden Sie 2 Token (Zugriffstoken, Aktualisierungstoken) als Antwort an den Client.
  2. Das Zugriffstoken hat weniger Ablaufzeit und das Aktualisieren hat eine lange Ablaufzeit.
  3. Der Client (Front-End) speichert das Aktualisierungstoken in seinem lokalen Speicher und das Zugriffstoken in Cookies.
  4. Der Client verwendet ein Zugriffstoken zum Aufrufen von APIs. Wenn es jedoch abläuft, wählen Sie das Aktualisierungstoken aus dem lokalen Speicher aus und rufen Sie die Authentifizierungsserver-API auf, um das neue Token abzurufen.
  5. Auf Ihrem Authentifizierungsserver wird eine API verfügbar gemacht, die ein Aktualisierungstoken akzeptiert, deren Gültigkeit überprüft und ein neues Zugriffstoken zurückgibt.
  6. Sobald das Aktualisierungstoken abgelaufen ist, wird der Benutzer abgemeldet.

Bitte lassen Sie mich wissen, wenn Sie weitere Details benötigen. Ich kann den Code (Java + Spring Boot) auch freigeben.

Für Ihre Fragen:

Q1: Es ist ein weiteres JWT mit weniger Ansprüchen und langer Ablaufzeit.

F2: Es wird nicht in einer Datenbank sein. Das Backend wird nirgendwo gespeichert. Sie entschlüsseln das Token einfach mit einem privaten / öffentlichen Schlüssel und validieren es auch mit seiner Ablaufzeit.

F3: Ja, richtig

Bhupinder Singh
quelle
27
Ich denke, das JWT sollte in localStorageund das refreshTokenin einem gespeichert werden httpOnly. Das refreshToeknkann verwendet werden, um ein neues JWT zu erhalten, daher muss es mit besonderer Vorsicht behandelt werden.
Tnc Andrei
2
Danke, was meinst du mit Speichern in httpOnly? Warum nicht beide in localStorage speichern?
Jay
8
Ich vermisse die Vorteile der Verwendung des Aktualisierungstokens. Wäre es nicht dasselbe, um die Gültigkeit des Zugriffstokens zu verlängern?
user2010955
3
@Jay Laut dem Microsoft Developer Network ist HttpOnly ein zusätzliches Flag, das in einem Set-Cookie-HTTP-Antwortheader enthalten ist. Durch die Verwendung des HttpOnly-Flags beim Generieren eines Cookies wird das Risiko verringert, dass clientseitige Skripte auf das geschützte Cookie zugreifen (sofern der Browser dies unterstützt).
shadow0359
22
# 2 ist sehr ungenau. Ein Aktualisierungstoken muss auf der Serverseite gespeichert werden. Sie sollten die "eigenständige" Eigenschaft von JWT nicht für ein Aktualisierungstoken nutzen. Auf diese Weise haben Sie keine andere Möglichkeit, Aktualisierungstoken zu widerrufen, als Ihren privaten Schlüssel zu ändern.
Jai Sharma
26

Basierend auf dieser Implementierung mit Node.js von JWT mit Aktualisierungstoken :

1) In diesem Fall verwenden sie eine UID und es ist keine JWT. Wenn sie das Token aktualisieren, senden sie das Aktualisierungstoken und den Benutzer. Wenn Sie es als JWT implementieren, müssen Sie den Benutzer nicht senden, da es sich innerhalb des JWT befinden würde.

2) Sie implementieren dies in einem separaten Dokument (Tabelle). Für mich ist dies sinnvoll, da ein Benutzer in verschiedenen Clientanwendungen angemeldet sein kann und über ein Aktualisierungstoken pro App verfügen kann. Wenn der Benutzer ein Gerät mit einer installierten App verliert, kann das Aktualisierungstoken dieses Geräts ungültig werden, ohne dass dies Auswirkungen auf die anderen angemeldeten Geräte hat.

3) In dieser Implementierung antwortet es auf die Anmeldemethode mit Zugriffstoken und Aktualisierungstoken. Es scheint mir richtig zu sein.

David
quelle
Mit "1) In diesem Fall verwenden sie eine UID ..." meinten Sie UUID?
Ozanmuyes
Was ist mit dieser einfacheren Implementierung - Ausgabe JWT - Senden Sie die ältere JWT, wenn Sie iat
aktualisieren
@adonese, indem Sie nur das senden, was JWTSie wollen, um das refresh_tokenInnere darin zu haben ? Wenn ja, sagt OAuth RFC 6749 ausdrücklich, dass nicht refresh_tokenan den Ressourcenserver gesendet werden soll (und das JWTwird an die Ressourcenserver gesendet): tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa