Ich benutze diesen Code Ссылка und alles funktioniert perfekt, aber ich weiß nicht wie um die Abmeldefunktionalität zu implementieren. Kann mir jemand Rat geben? Danke.
Die clientseitige Abmeldung ist einfach, verwerfen Sie einfach das Token, das Sie besitzen. Um eine serverseitige Abmeldefunktion bereitzustellen, muss Ihre Anwendung auf aktuell authentifizierte Clients, dh vorhandene Tokens, achten. Das "build-in" -Problem bei der tokenbasierten Authentifizierung besteht darin, dass ein veröffentlichtes Token solange gültig ist, bis es abläuft und es keine "remote invalidation" -Lösung gibt. Ihre einzige Chance besteht darin, den Zugriff auf Anfragen mit einem Token zu vermeiden, dem Sie nicht mehr vertrauen.
Sie müssen sich also jedes veröffentlichte Token in einem Container mit dem Namen Token-Speicher .
Es gibt einige Implementierungen der TokenStore
Schnittstelle, um im Arbeitsspeicher oder vielleicht mit einer Datenbank ( JdbcTokenStore
) zu arbeiten. Für ein einfaches Beispiel ist InMemoryTokenStore
völlig ausreichend.
Um es zu verwenden, muss ein Token-Speicher wie folgt erstellt und konfiguriert werden:
Fügen Sie dies Ihrem AuthorizationServerConfiguration
hinzu:
Und benutze es in AuthorizationServerEndpointsConfigurer
:
Fügen Sie es auch Ihrem ResourceServerConfiguration
hinzu:
Das ist fast alles. Jetzt können Sie Ihre Logout-Funktionalität so implementieren, wie Sie sie benötigen, vielleicht mit einem speziellen Endpunkt, wo Sie nur die Token erhalten und sie mit:
aus dem Token-Speicher entfernen müssen %Vor%Achten Sie darauf, auch das Aktualisierungstoken zu entfernen, andernfalls (wenn nur das Zugriffstoken entfernt wird), kann der Client einen neuen mit dem Aktualisierungstoken erhalten.
Hier ist ein Testfall entsprechend Ihren Tests, um zu überprüfen, ob es funktioniert:
%Vor%Und zumindest eine Empfehlung mit MockMvc ist ein großartiges Test-Framework, das das Testen von Ruheaufrufen erleichtert und Sie bei der Arbeit mit dem RestTemplate die Hindernisse und den Kachelcode beseitigen können. Vielleicht möchtest du es versuchen.
Da sobald die Abmeldung abgeschlossen ist, beide Zugriffstoken & amp; Refresh-Token wird aus dem zugrunde liegenden Speicher auf dem Auth-Server entfernt. Wir müssen uns nur über die Ungültigkeit des Zugriffstokens auf Ressourcenservern Gedanken machen, bis diese abläuft
Um dies zu erreichen, müssen Sie ein Ereignis von auth-server
veröffentlichen, sobald die Abmeldung über Spring Stream / Integration & amp; Veranlassen Sie, dass alle Token-Zielgruppeninstanzen das Logout-Ereignis abonnieren
Sie können Ihr eigenes LogoutHandler
hinzufügen, das dieses Ereignis vom Authentifizierungsserver veröffentlicht. @StreamListner
von Spring cloud stream kann verwendet werden, um auf jedem der Ressourcenserver auf diese Ereignisse zu warten
Dieses Abmeldeereignis muss den entfernten Zugriffstoken & amp; die verbleibende Zeit bis zum Ablauf. Alle Empfänger dieses Ereignisses müssen diese Zugriffstoken im Speicher auf einer Blacklist & amp; stellen Sie sicher, dass sie den Zugriff auf eine Ressource ablehnen, wenn das empfangene Zugriffstoken mit vorhandenen Token mit der schwarzen Liste übereinstimmt. Nachdem das Zugriffstoken abgelaufen ist, entfernen Sie es einfach aus dem Speicher. Um Schlüssel automatisch ablaufen zu lassen, können Sie etwas wie CacheBuilder
von guava
Also, im Allgemeinen, AFAIK, gibt es keine gebrauchsfertige Lösung für den Ablauf des Zugriffstokens aufgrund der Natur von JWT
Tags und Links authentication spring-boot jwt logout