Wie zerstöre ich JWT-Token beim Abmelden?

75

Ich benutze JWT Plugin und Strategie in Hapijs.

Ich bin in der Lage, ein JWT-Token zu erstellen, während ich mich anmelde, und andere APIs mit demselben Token über die JWT-Strategie zu authentifizieren.

Ich setze das Token request.state.USER_SESSIONals Cookie, wobei USER_SESSIONes sich um einen Token-Namen handelt. Außerdem speichere ich dieses Token nicht in der Datenbank.

Aber wie kann ich das JWT-Token zum Zeitpunkt der Abmeldung zerstören?

Bitte schlagen Sie einen Weg vor.

Garima
quelle

Antworten:

92

Das JWT wird im Browser gespeichert. Entfernen Sie daher das Token, mit dem das Cookie auf der Clientseite gelöscht wird

Wenn Sie das Token auch vor Ablauf der Serverzeit von der Serverseite ungültig machen müssen, z. B. Konto gelöscht / blockiert / gesperrt, Kennwort geändert, Berechtigungen geändert, Benutzer vom Administrator abgemeldet, sehen Sie sich Invalidating JSON Web Tokens für einige gängige Techniken an Erstellen einer schwarzen Liste oder rotierender Token

pedrofb
quelle
1
Ich stimme Ihrer Antwort zu. Ich setze das JWT-Token im Cookie mit 'reply.state (' USER_SESSION ', {jwtToken});' Dabei ist USER_SESSION der Cookie-Name. Können Sie mir also vorschlagen, welchen Befehl ich ausführen soll, um den Cookie in Hapijs aus dem Status zu entfernen?
Garima
2
Sie befinden sich auf der Serverseite und können Browser nicht zwingen, ein Cookie zu löschen. Sie können den Wert jedoch auf leer setzen und das expiresFeld einschließen , um den Cookie-Wert ungültig zu machen. Siehe stackoverflow.com/questions/5285940/… . Sie können Cookies auch auf der Clientseite mit Javascript ungültig machenvar delete_cookie = function(name) { document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;'; };
pedrofb
37

Sie können ein Token nicht manuell ablaufen lassen, nachdem es erstellt wurde. Daher können Sie sich nicht wie bei Sitzungen mit JWT auf der Serverseite abmelden.

JWT ist zustandslos. Dies bedeutet, dass Sie alles, was Sie benötigen, in der Nutzlast speichern und die Durchführung einer DB-Abfrage bei jeder Anforderung überspringen sollten. Wenn Sie jedoch eine strikte Abmeldefunktion planen, die nicht auf den automatischen Ablauf des Tokens warten kann, obwohl Sie das Token von der Clientseite entfernt haben, müssen Sie möglicherweise die zustandslose Logik vernachlässigen und einige Abfragen durchführen. Was ist eine Lösung?

  • Stellen Sie eine angemessene Ablaufzeit für Token ein

  • Löschen Sie das gespeicherte Token beim Abmelden von der Clientseite

  • Bei jeder autorisierten Anfrage wurde ein Token für die Blacklist abgefragt

Schwarze Liste

"Blacklist" aller Token, die nicht mehr gültig sind und noch nicht abgelaufen sind. Sie können eine Datenbank mit einer TTL-Option für Dokumente verwenden, die auf die verbleibende Zeit bis zum Ablauf des Tokens festgelegt wird.

Redis

Redis ist eine gute Option für die Blacklist , die einen schnellen In-Memory-Zugriff auf die Liste ermöglicht. Dann sollten Sie in einer Middleware, die bei jeder autorisierten Anforderung ausgeführt wird, überprüfen, ob sich das bereitgestellte Token in der Blacklist befindet . Wenn dies der Fall ist, sollten Sie einen nicht autorisierten Fehler auslösen. Wenn dies nicht der Fall ist, lassen Sie es los und die JWT-Überprüfung wird es verarbeiten und feststellen, ob es abgelaufen ist oder noch aktiv ist.

Weitere Informationen finden Sie unter Abmelden bei Verwendung von JWT . von Arpy Vanyan

Jamil Noyda
quelle
3
Es wäre schön, wenn Sie die Quelle dieser Antwort mitteilen würden
Emilio Numazaki
1
Großartig! Mein Punkt hier ist, dass es da draußen mehr Informationen gibt, also wäre es für andere nützlich. Vielen Dank!
Emilio Numazaki
1
Vielen Dank für die eine der besten Antworten
MUFAzmi
15

Beim Abmelden von der Clientseite ist es am einfachsten, das Token aus dem Speicher des Browsers zu entfernen.

Was ist, wenn Sie das Token auf dem Knotenserver zerstören möchten?

Das Problem mit dem JWT-Paket ist, dass es keine Methode oder Möglichkeit zum Zerstören des Tokens bietet.

Um das Token auf der Serverseite zu zerstören, können Sie anstelle von JWT das Paket jwt-redis verwenden

Diese Bibliothek (jwt-redis) wiederholt die gesamte Funktionalität der Bibliothek jsonwebtoken mit einer wichtigen Ergänzung vollständig. Mit Jwt-redis können Sie das Token-Label in redis speichern, um die Gültigkeit zu überprüfen. Das Fehlen eines Token-Labels in redis macht das Token ungültig. Um das Token in jwt-redis zu zerstören, gibt es eine Zerstörungsmethode

es funktioniert so:

1) Installieren Sie jwt-redis von npm

2) Erstellen -

var redis = require('redis');
var JWTR =  require('jwt-redis').default;
var redisClient = redis.createClient();
var jwtr = new JWTR(redisClient);

jwtr.sign(payload, secret)
    .then((token)=>{
            // your code
    })
    .catch((error)=>{
            // error handling
    });

3) Um zu überprüfen -

jwtr.verify(token, secret);

4) Zu zerstören -

jwtr.destroy(token)

Hinweis : Sie können expiresIn während der Anmeldung des Tokens genauso angeben, wie es in JWT bereitgestellt wird.

Aman Kumar Gupta
quelle
jwt.destroy ist keine Funktion
abbasalim
3
jwt bietet keine Methode zum Zerstören, ich habe dies oben ausführlich erklärt, daher habe ich jwt-redis package verwendet. Wenn Sie sich also den Code ansehen, habe ich jwtr.destroy () geschrieben
Aman Kumar Gupta
Warum nicht einfach einen separaten Platz in der Standarddatenbank erstellen, um Token auf der schwarzen Liste zu speichern? Warum Redis hereinbringen?
Robertfoenix
Wenn Sie alle Ihre Backlist-Token in der Datenbank speichern, wie können Sie dann das Token zerstören oder seine Gültigkeit überprüfen, ohne die Datenbank zu erreichen. Was Sie dann tun müssen, um bei jeder eingehenden Anforderung mit Token die Datenbank zuerst mit diesem Token zu erreichen, ob es vorhanden ist oder nicht, und dann einen entsprechenden Fehler zu senden. Meine Frage ist jedoch, warum Sie unnötig auf die Datenbank zugreifen oder das Token speichern müssen, das überhaupt nicht erforderlich ist Hier kommt also das jwt-redis, das die Token-ID in redis speichert und von dort aus zerstört. Nach der Zerstörung kann es nicht überprüft werden.
Aman Kumar Gupta
1

Sie können dem Token "Ausgabezeit" hinzufügen und die "letzte Abmeldezeit" für jeden Benutzer auf dem Server beibehalten. Wenn Sie die Gültigkeit des Tokens überprüfen, überprüfen Sie auch, ob die "Ausgabezeit" nach der "letzten Abmeldezeit" liegt.

Rabolfazl
quelle
0

Während andere Antworten detaillierte Lösungen für verschiedene Setups bieten, kann dies jemandem helfen, der nur nach einer allgemeinen Antwort sucht.

Es gibt drei allgemeine Optionen: Wählen Sie eine oder mehrere aus:

  1. Löschen Sie auf der Clientseite das Cookie mit Javascript aus dem Browser.

  2. Setzen Sie auf der Serverseite den Cookie-Wert auf eine leere Zeichenfolge oder etwas Nutzloses (z. B. "deleted") und setzen Sie die Cookie-Ablaufzeit auf eine Zeit in der Vergangenheit.

  3. Aktualisieren Sie auf der Serverseite das in Ihrer Datenbank gespeicherte Aktualisierungstoken. Verwenden Sie diese Option, um den Benutzer von allen Geräten abzumelden, auf denen er angemeldet ist (seine Aktualisierungstools werden ungültig und er muss sich erneut anmelden).

Magnus W.
quelle