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_SESSION
als Cookie, wobei USER_SESSION
es 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.
expires
Feld 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;'; };
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
quelle
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 -
4) Zu zerstören -
Hinweis : Sie können expiresIn während der Anmeldung des Tokens genauso angeben, wie es in JWT bereitgestellt wird.
quelle
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.
quelle
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:
Löschen Sie auf der Clientseite das Cookie mit Javascript aus dem Browser.
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.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).
quelle