Heim  >  Artikel  >  Java  >  So integrieren Sie die JWT-Authentifizierung in SpringBoot (mit Code)

So integrieren Sie die JWT-Authentifizierung in SpringBoot (mit Code)

不言
不言nach vorne
2019-03-19 09:39:393488Durchsuche

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 dieses Tool und welches Problem löst dieses Tool?
  • Ist es auf das aktuelle Geschäftsszenario anwendbar, in dem wir uns befinden?
  • Wird es Probleme mit sich bringen? nach der Verwendung? Andere Fragen
  • Wie man es verwendet, ist die beste Vorgehensweise

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)

1.2 Anwendungsszenarien

Was sind die Anwendungsszenarien von JWT in der tatsächlichen Entwicklung?

1.2.1 Autorisierung

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.

1.2.2 Informationsaustausch

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.

2. Die Struktur von JWT

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.

2.1-Header

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.

2.2 Nutzlast

payloadUm 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.

2.3-Signatur

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.

3. JWT-Anwendungsszenarien in Spring-Projekten

3.1 Der Code zum Generieren von JWT

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.

3.2 JWT zurückgeben

Nachdem sich der Benutzer erfolgreich am System angemeldet hat, wird das Token als Rückgabeparameter verwendet und an das Frontend zurückgegeben.

3.3 Token überprüfen

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.

3.3.1 Token analysieren

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.

3.3.2 Bestimmen Sie die Gültigkeit des Tokens

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.

So integrieren Sie die JWT-Authentifizierung in SpringBoot (mit Code)

3.3.3 Ablaufzeit der Aktualisierung

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.

3.3.4 Redis ist eine gute Methode

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.

So integrieren Sie die JWT-Authentifizierung in SpringBoot (mit Code)

Nach einer solchen Rekonstruktion sieht der Prozess so aus.

So integrieren Sie die JWT-Authentifizierung in SpringBoot (mit Code)

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen