Der Inhalt dieses Artikels befasst sich mit der Integration der JWT-Authentifizierung in SpringBoot. Ich hoffe, dass er für Sie hilfreich ist . Hilft.
1. Über JWT
1.1 Was ist JWT
Um mit dem Klischee zu beginnen: Wenn wir ein solches Tool verwenden möchten, müssen wir zunächst Folgendes wissen Probleme.
Was ist JWT? Das Folgende ist meine Übersetzung der Einführung in JWT auf der offiziellen Website von jwt.
JSON Web Token (JWT) ist ein offener Standard (RFC 7519), der eine kompakte und unabhängige Methode zur sicheren Übertragung von Informationen zwischen Parteien mithilfe von JSON-Objekten definiert.
Jetzt wissen wir, dass JWT tatsächlich ein offener Standard für die sichere Übertragung von durch JSON dargestellten Daten zwischen mehreren Punkten ist. Während des Übertragungsprozesses erscheint JWT in Form einer Zeichenfolge in unserem Sichtfeld. Die Informationen in dieser Zeichenfolge können durch digitale Signaturen überprüft und als vertrauenswürdig eingestuft werden. (Empfohlen: Java-Tutorial)
Was sind die Anwendungsszenarien von JWT in der tatsächlichen Entwicklung?
Dies sollte als das häufigste Nutzungsszenario von JWT angesehen werden. Sobald sich der Benutzer in der Front-End-Schnittstelle erfolgreich angemeldet hat, wird das vom Back-End zurückgegebene JWT empfangen. Nachfolgende Anfragen enthalten das vom Backend zurückgegebene JWT als Anmeldeinformationen für den Zugriff auf Backend-Routen, -Dienste und -Ressourcen.
Die Verwendung von JWT zum Übertragen von Informationen zwischen mehreren Parteien weist ein gewisses Maß an Sicherheit auf. Beispielsweise kann JWT HMAC, den asymmetrischen RSA-Verschlüsselungsalgorithmus und den digitalen Signaturalgorithmus ECDSA verwenden Durch das Signieren kann sichergestellt werden, dass der Absender der Nachricht der tatsächliche Absender ist. Mithilfe der Signaturberechnung von Header und Nutzlast können wir außerdem überprüfen, ob die gesendete Nachricht manipuliert wurde.
Im Allgemeinen besteht JWT aus einer Zeichenfolge, die aus drei Teilen besteht header.payload.signature
Es gibt zu viele Beiträge im Internet, um diesen Teil kurz vorzustellen Stellen Sie es hier vor.
header
besteht aus dem verwendeten Signaturalgorithmus und dem Typ des Tokens. Beispielsweise ist der Typ des Tokens ein offener Standard wie JWT, und der verwendete Signaturalgorithmus ist HS256
, das ist der HmacSHA256
-Algorithmus. Andere Verschlüsselungsalgorithmen umfassen HmacSHA512
, SHA512withECDSA
usw.
Konvertieren Sie dann dieses JSON-Objekt, das zwei Attribute enthält, in eine Zeichenfolge und verwenden Sie dann die Base64-Codierung, um schließlich den JWT-Header zu bilden.
payload
Um es ganz klar auszudrücken: Es ähnelt den Daten in Ihrem Anfragetext. Es gibt nur drei Arten: vorab deklariert, benutzerdefiniert und privat. Ebenso wie der Absender iss
und die Ablaufzeit exp
handelt es sich bei allen um vorregistrierte Anweisungen.
Eine Vorabdeklaration der Daten in der Payload ist nicht verpflichtend, wird aber offiziell empfohlen. Dann wird diese JSON-Zeichenfolge ähnlich wie requestBody Base64-codiert, um den zweiten Teil des JWT zu bilden.
Wenn Sie signature
generieren möchten, müssen Sie das Geheimnis im benutzerdefinierten JWT-Konfigurationselement verwenden, das der für die Hmac-Algorithmusverschlüsselung erforderliche Schlüssel ist. Verbinden Sie den zuvor Base64-codierten Header und die Nutzlast mit .
, signieren Sie die Nachricht dann mit einem benutzerdefinierten Schlüssel und generieren Sie schließlich eine Signatur.
Die generierte Signatur wird verwendet, um zu überprüfen, dass die Nachricht während der Übertragung nicht verändert wurde. Bei Verwendung eines asymmetrischen Verschlüsselungsalgorithmus zum Signieren kann damit auch überprüft werden, ob der Absender des JWT dieselbe Person ist wie der in der Payload deklarierte Absender.
lautet wie folgt.
public String createJwt(String userId, String projectId) throws IllegalArgumentException, UnsupportedEncodingException { Algorithm al = Algorithm.HMAC256(secret); Instant instant = LocalDateTime.now().plusHours(outHours).atZone(ZoneId.systemDefault()).toInstant(); Date expire = Date.from(instant); String token = JWT.create() .withIssuer(issuer) .withSubject("userInfo") .withClaim("user_id", userId) .withClaim("project_id", projectId) .withExpiresAt(expire) .sign(al); return token; }
Die beiden übergebenen Ansprüche sind die benutzerdefinierten Nutzdaten im Projekt, al
ist der ausgewählte Algorithmus, secret
ist der Schlüssel zum Signieren der Informationen und subject
ist der Betreff des Tokens , withExpiresAt
gibt die Ablaufzeit des Tokens an.
Nachdem sich der Benutzer erfolgreich am System angemeldet hat, wird das Token als Rückgabeparameter verwendet und an das Frontend zurückgegeben.
Nachdem das Token an das Front-End zurückgegeben wurde, muss das Back-End überprüfen, ob das Token legal ist und ob auf die Ressourcen des Servers zugegriffen werden kann . Dies kann hauptsächlich durch die folgenden Methoden überprüft werden.
Verwenden Sie JWTVerifier
, um das Token zu analysieren. Dies ist der erste Schritt, um zu überprüfen, ob das Token legal ist Wenn Sie eine Zeichenfolge bedeutungsloser Zeichenfolgen verwenden, kann bei diesem Schritt ein Fehler ausgegeben werden. Der Beispielcode lautet wie folgt.
try { Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm).build(); DecodedJWT jwt = verifier.verify(token); } catch (JWTVerificationException e) { e.printStackTrace(); }
JWTVerifier kann den Algorithmus, der die geheime Signatur und den angegebenen Anspruch formuliert, verwenden, um die Legitimität des Tokens zu überprüfen.
Nachdem Sie beurteilt haben, dass der Token gültig ist, überprüfen Sie die Gültigkeit des Tokens.
try { Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm).build(); DecodedJWT jwt = verifier.verify(token); if (jwt.getExpiresAt().before(new Date())) { System.out.println("token已过期"); return null; } } catch (JWTVerificationException e) { e.printStackTrace(); return null; }
Wenn das Token abläuft, ist der Zugriff auf Serverressourcen nicht gestattet. Der spezifische Prozess ist wie folgt.
Die Gültigkeitsdauer des oben erstellten Tokens ist konfigurierbar, vorausgesetzt, sie beträgt 2 Stunden, und der Benutzer meldet sich an und arbeitet kontinuierlich 1 Stunde Klicken Sie nach 59 Minuten auf „OK“, wenn Sie einen sehr wichtigen Vorgang ausführen. Zu diesem Zeitpunkt ist das Token abgelaufen. Verfügt das Programm über keine Schutzstrategie, sind fast zwei Stunden der Arbeit des Benutzers umsonst.
Wenn wir auf ein solches Problem stoßen, muss unser bisheriges Prozessdesign zwangsläufig umgebaut werden. Möglicherweise haben Sie Fragen: Ist es nicht erforderlich, die Ablaufzeit des Tokens für jeden Vorgang zu aktualisieren, nachdem sich der Benutzer angemeldet hat?
Dann kommt die Frage, dass das Token aus drei Inhalten besteht header.payload.signature
und die Ablaufzeit zur Nutzlast gehört wird zwangsläufig mit der Nutzlast identisch sein.
Mit anderen Worten, dies ist ein brandneuer Token. Wie erhält das Frontend dieses neue Token? Die denkbare Lösung ist nichts anderes, als das Token basierend auf der Rückgabe im Antwortheader für jede Anfrage kontinuierlich zu aktualisieren. Diese Methode dringt jedoch in die Geschäftsschicht der Front-End-Entwicklung ein. Jede Schnittstelle muss das Token aktualisieren.
Man könnte sagen, dass es nichts weiter ist als das Hinzufügen eines Abfangjägers, der das Geschäft nicht zu sehr beeinträchtigt. Obwohl dieser Teil der Logik im Interceptor geschrieben ist, verfügt das Frontend aufgrund der Token-Authentifizierungslogik über diesen zusätzlichen Code. Im Hinblick auf die funktionale Arbeitsteilung ist dieser Teil des Codes eigentlich die Back-End-Logik.
Um es einfacher auszudrücken: Das Aktualisieren des Tokens und die Verwaltung der Aktualität des Tokens sollten vom Backend durchgeführt werden. Das Frontend braucht und sollte sich nicht um diesen Teil der Logik kümmern.
Zusammenfassend muss die Ablaufzeit des Aktualisierungstokens im Backend platziert werden, und ob das Token gültig ist, kann nicht anhand des Ablaufdatums beurteilt werden in der Nutzlast im JWT.
Nachdem sich der Benutzer erfolgreich angemeldet und das Token an das Frontend zurückgegeben hat, muss es mit einer eindeutigen Darstellung als Schlüssel und dem aktuellen Token als Wert in den Redis-Cache geschrieben werden. Und nachdem jede Benutzeranforderung erfolgreich war, wird die Ablaufzeit des Tokens aktualisiert. Der Vorgang ist wie folgt.
Nach einer solchen Rekonstruktion sieht der Prozess so aus.
Dabei gibt es einen zusätzlichen Prozess zum Aktualisieren des Tokens. Solange sich der Benutzer beim System anmeldet, wird bei jedem Vorgang die Ablaufzeit des Tokens aktualisiert und es kommt zu keinem Datenverlust durch plötzliche Fehler während eines Vorgangs, wie bereits erwähnt.
Wenn der Benutzer innerhalb von zwei Stunden nach der Anmeldung keine Vorgänge ausführt, wird ihm der Zugriff durch den Server direkt verweigert, wenn er die Schnittstelle nach 2 Stunden erneut anfordert.
4. Zusammenfassung
Im Allgemeinen wird nicht empfohlen, besonders sensible Informationen in JWT abzulegen. Wenn der asymmetrische Verschlüsselungsalgorithmus nicht verwendet wird, können Sie ihn nach dem Kopieren des Tokens direkt auf der offiziellen Website von jwt online analysieren. Wenn die Anfrage abgefangen wird, sind alle darin enthaltenen Informationen transparent.
Aber JWT kann als Anmeldeinformation für den Zugriff auf Serverressourcen für einen bestimmten Zeitraum verwendet werden. Wenn die JWT-Nutzlast beispielsweise das Feld „userId“ enthält, kann die Legitimität des durch das Token identifizierten Benutzers überprüft werden. Ist der Benutzer beispielsweise derzeit gesperrt? Existiert der durch diese Benutzer-ID identifizierte Benutzer in unserem System? usw.
Und durch die Veröffentlichung des Tokens können sich Benutzer von mehreren Terminals gleichzeitig anmelden. Das Erstellen eines Tokens nach dem Anmelden wie zuvor beschränkt den Benutzer darauf, sich nur auf einem Gerät gleichzeitig anmelden zu können.
Das obige ist der detaillierte Inhalt vonSo integrieren Sie die JWT-Authentifizierung in SpringBoot (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!