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.
By-Value-Token - Zugeordnete Informationen, einschließlich der Token-Lebensdauer, sind im Token selbst enthalten, und die Informationen können als von einer vertrauenswürdigen Quelle stammend überprüft werden (digitale Signaturen zur Rettung).
Referenztoken - Die zugehörigen Informationen werden im serverseitigen Speicher gespeichert, der dann unter Verwendung des Tokenwerts als Schlüssel abgerufen wird. Als serverseitiger Speicher werden die zugehörigen Informationen implizit als vertrauenswürdig eingestuft
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:
Im ersteren Fall ( in sich geschlossene Token ) kann eine (derzeit nicht standardisierte) Backend-Interaktion zwischen dem Autorisierungsserver und dem Ressourcenserver verwendet werden, wenn ein sofortiger Widerruf des Zugriffstokens gewünscht wird.
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