Ich verwende Spring Security OAuth2- und JWT-Token. Meine Frage lautet: Wie kann ich ein JWT-Token widerrufen?
Wie hier erwähnt, http://projects.spring.io/spring-security-oauth/docs/oauth2.html , erfolgt der Widerruf durch ein Aktualisierungstoken. Aber es scheint nicht zu funktionieren.
Antworten:
Im Allgemeinen wäre die einfachste Antwort zu sagen, dass Sie ein JWT-Token nicht widerrufen können, aber das stimmt einfach nicht . Die ehrliche Antwort lautet, dass die Kosten für die Unterstützung des Widerrufs von JWT so hoch sind, dass sie die meiste Zeit nicht wert sind oder eine Alternative zu JWT eindeutig überdenken.
In einigen Szenarien benötigen Sie möglicherweise sowohl JWT als auch einen sofortigen Token-Widerruf. Lassen Sie uns also durchgehen, was erforderlich ist, aber zuerst werden wir einige Konzepte behandeln.
JWT ( Learn JSON Web Tokens ) gibt nur ein Token-Format an. Dieses Widerrufsproblem würde auch für jedes Format gelten, das in einem normalerweise als eigenständiges Token oder nach Wert bezeichneten Token verwendet wird. Ich mag die letztere Terminologie, weil sie einen guten Kontrast zu den Referenztoken bildet.
Vor dem JWT-Urknall haben wir uns bereits mit Token in unseren Authentifizierungssystemen befasst. Es war üblich, dass eine Anwendung bei der Benutzeranmeldung eine Sitzungskennung erstellte, die dann verwendet wurde, damit der Benutzer den Anmeldevorgang nicht jedes Mal wiederholen musste. Diese Sitzungskennungen wurden als Schlüsselindizes für den serverseitigen Speicher verwendet. Wenn dies ähnlich klingt wie etwas, das Sie kürzlich gelesen haben, haben Sie Recht, dies wird tatsächlich als Referenztoken klassifiziert.
Unter Verwendung der gleichen Analogie ist es trivial, den Widerruf für Referenztoken zu verstehen. Wir löschen nur den serverseitigen Speicher, der diesem Schlüssel zugeordnet ist, und wenn der Schlüssel das nächste Mal bereitgestellt wird, ist er ungültig.
Für By-Value-Token müssen wir nur das Gegenteil implementieren. Wenn Sie den Widerruf des Tokens anfordern, speichern Sie etwas, mit dem Sie dieses Token eindeutig identifizieren können, sodass Sie beim nächsten Empfang zusätzlich prüfen können, ob es widerrufen wurde. Wenn Sie bereits der Meinung sind, dass sich so etwas nicht skalieren lässt, müssen Sie die Daten nur bis zum Ablauf des Tokens speichern. In den meisten Fällen können Sie wahrscheinlich nur einen Hash des Tokens speichern, damit dies immer der Fall ist etwas von einer bekannten Größe sein.
Als letzte Anmerkung und um dies auf OAuth 2.0 zu zentrieren, ist der Widerruf von Zugriffstoken nach Wert derzeit nicht standardisiert. Der OAuth 2.0-Token-Widerruf besagt jedoch ausdrücklich, dass er weiterhin erreicht werden kann, solange sowohl der Autorisierungsserver als auch der Ressourcenserver einer benutzerdefinierten Vorgehensweise zustimmen:
Wenn Sie sowohl den Autorisierungsserver als auch den Ressourcenserver steuern, ist dies sehr einfach zu erreichen. Wenn Sie andererseits die Autorisierungsserverrolle an einen Cloud-Anbieter wie Auth0 oder eine Drittanbieter-Komponente wie Spring OAuth 2.0 delegieren, müssen Sie die Dinge höchstwahrscheinlich anders angehen, da Sie wahrscheinlich nur das erhalten, was bereits standardisiert ist.
Eine interessante Referenz
Dieser Artikel erklärt einen anderen Weg, dies zu tun: Blacklist JWT Es enthält einige interessante Praktiken und Muster, gefolgt von RFC7523
quelle
Das JWT kann nicht widerrufen werden.
Aber hier ist eine alternative Lösung, die als JWT alt für neues Austauschschema bezeichnet wird .
Da wir das ausgestellte Token nicht vor Ablauf der Gültigkeitsdauer ungültig machen können, verwenden wir immer ein Kurzzeit-Token, z. B. 30 Minuten. Wenn das Token abgelaufen ist, verwenden wir das alte Token, um ein neues Token auszutauschen. Der kritische Punkt ist eine alte Token ein neues Token austauschen kann nur .
Auf dem Center Auth Server verwalten wir eine Tabelle wie folgt:
Benutzer-ID in JWT-Zeichenfolge enthalten. jwt_hash ist ein Hashwert der gesamten JWT-Zeichenfolge, z. B. SHA256. Das Ablauffeld ist optional.
Folgendes ist der Arbeitsablauf:
Um das Token kontinuierlich zu verwenden, müssen sowohl der legale Benutzer als auch der Hacker kontinuierlich ein neues Token austauschen. Nur eines kann erfolgreich sein. Wenn eines fehlschlägt, müssen sich beide beim nächsten Austausch erneut anmelden.
Wenn der Hacker das Token erhalten hat, kann es für kurze Zeit verwendet werden, kann jedoch nicht gegen ein neues ausgetauscht werden, wenn ein legaler Benutzer das nächste Mal ein neues ausgetauscht hat, da die Gültigkeitsdauer des Tokens kurz ist. Auf diese Weise ist es sicherer.
Wenn es keinen Hacker gibt, muss der normale Benutzer auch regelmäßig neue Token austauschen, z. B. alle 30 Minuten. Dies entspricht einer automatischen Anmeldung. Die zusätzliche Last ist nicht hoch und wir können die Ablaufzeit für unsere Anwendung anpassen.
Quelle: http://www.jianshu.com/p/b11accc40ba7
quelle
Dies beantwortet Ihre Frage in Bezug auf das Spring-Framework nicht genau. In diesem Artikel wird jedoch erläutert, warum Sie, wenn Sie die Möglichkeit benötigen, JWTs zu widerrufen, möglicherweise nicht in erster Linie mit JWTs arbeiten und stattdessen reguläre verwenden möchten. undurchsichtige Inhaber-Token.
https://www.dinochiesa.net/?p=1388
quelle
Eine Möglichkeit, eine JWT zu widerrufen, besteht darin, ein verteiltes Ereignissystem zu nutzen, das Dienste benachrichtigt, wenn Aktualisierungstoken widerrufen wurden. Der Identitätsanbieter sendet ein Ereignis, wenn ein Aktualisierungstoken widerrufen wird und andere Backends / Dienste auf das Ereignis warten. Wenn ein Ereignis empfangen wird, aktualisieren die Backends / Services einen lokalen Cache, der eine Gruppe von Benutzern verwaltet, deren Aktualisierungstoken widerrufen wurden.
Dieser Cache wird dann überprüft, wenn eine JWT überprüft wird, um festzustellen, ob die JWT widerrufen werden soll oder nicht. Dies alles basiert auf der Dauer der JWTs und dem Ablaufzeitpunkt der einzelnen JWTs.
Dieser Artikel, JWTs widerrufen , veranschaulicht dieses Konzept und enthält eine Beispiel-App für Github.
quelle
Was ist mit dem Speichern des JWT-Tokens und dem Verweisen auf den Benutzer in der Datenbank? Wenn Sie die Guards / Sicherheitssysteme in Ihrer Backend-Anwendung nach dem JWT-Vergleich um einen zusätzlichen DB-Join erweitern, können Sie sie praktisch "widerrufen", indem Sie sie aus der DB entfernen oder aus der DB löschen.
quelle
Ich habe eine Möglichkeit gefunden, das Problem zu beheben : Wie kann ein bereits generiertes vorhandenes JWT-Token mit Java verfallen?
In diesem Fall müssen wir eine beliebige Datenbank oder einen In-Memory-Speicher verwenden, in dem
Schritt 1: Sobald das Token zum ersten Mal für einen Benutzer generiert wurde, speichern Sie es in einer Datenbank mit dem Token und es ist " issedAt () ".
Ich habe es in DB in diesem JSON-Format gespeichert.
Beispiel: {
"username" : "username", "token" : "token", "issuedAt" : "issuedAt"
}Schritt 2: Wenn Sie eine Webdienstanforderung für denselben Benutzer mit einem zu validierenden Token erhalten, rufen Sie den Zeitstempel " issitedAt () " vom Token ab und vergleichen Sie ihn mit dem gespeicherten (DB / in-memory) ausgegebenen Zeitstempel.
Schritt 3: Wenn der gespeicherte ausgegebene Zeitstempel neu ist (mit der after () / before () -Methode), geben Sie zurück, dass das Token ungültig ist (in diesem Fall läuft das Token nicht ab, aber wir gewähren keinen Zugriff mehr auf dieses Token).
So habe ich das Problem gelöst.
quelle