php-Redakteur Banana wies darauf hin, dass man bei der Verwendung von JWT (JSON Web Tokens) beachten muss, dass dessen Gültigkeit nicht behauptet werden kann und nicht vertrauenswürdig ist. JWT ist ein Token, der zur Authentifizierung und Autorisierung verwendet wird. Aufgrund seiner eigenständigen Natur kann seine Gültigkeit jedoch nicht garantiert werden, sobald das Token manipuliert wird. Daher sollten wir bei der Verwendung von JWT strenge Überprüfungsmaßnahmen ergreifen, einschließlich der Überprüfung von Signaturen, Ablaufzeit usw., und keine vertraulichen Informationen in JWT speichern, um Sicherheitsrisiken zu vermeiden.
Mein jwtutil.java-Code:
@service @requiredargsconstructor public class jwtutil { private secretkey getsigningkey() { return jwts.sig.hs512.key().build(); } public string generatetoken(securitymember securitymember) { map<string, object> claims = new hashmap<>(); return createtoken(claims, securitymember.getusername()); } public string createtoken(map<string, object> claims, string subject) { return jwts.builder().claims(claims).subject(subject).issuedat(new date(system.currenttimemillis())) .expiration(new date(system.currenttimemillis() + 1000 * 60 * 60 * 10)) .signwith(getsigningkey()) .compact(); } public boolean validatetoken(string token, securitymember securitymember) { final string username = extractusername(token); return (username.equals(securitymember.getusername()) && !istokenexpired(token)); } private boolean istokenexpired(string token) { return extractexpiration(token).before(new date(system.currenttimemillis())); } public date extractexpiration(string token) { return extractclaims(token,claims::getexpiration); } public string extractusername(string token) { return extractclaims(token,claims::getsubject); } private <t> t extractclaims(string token, function<claims, t> claimsresolver) { final jwe<claims> claims = extractallclaims(token); return claimsresolver.apply(claims.getpayload()); } private jwe<claims> extractallclaims(string token) { try { return jwts.parser() .requireissuer("http://localhost:8080") .verifywith(getsigningkey()) .build() .parse(token).accept(jwe.claims); } catch (jwtexception ex) { throw new jwtexception("wrong jwt"+ex.getmessage(),ex); } } }
Die Frage ist:
Caused by: io.jsonwebtoken.security.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
Ihre Funktion getsigningkey()
使用 jwts.sig.hs512.key().build();
, die bei jedem Aufruf einen neuen Schlüssel erstellt.
Aber Sie rufen getsigningkey()
an, wenn Sie den Token signieren und wenn Sie den Token verifizieren, sodass Sie in beiden Fällen unterschiedliche Schlüssel haben.
Erstellen Sie stattdessen einen Schlüssel, speichern Sie ihn und verwenden Sie den gespeicherten Schlüssel. Zum Beispiel:
signingKey = getSigningKey(); // use it for signing Jwts.builder().signWith(signingKey)... // and verification Jwts.parser().verifyWith(signingKey)...
Aber die Erstellung des Schlüssels sollte nicht bei jeder Token-Erstellung erfolgen, sondern getrennt davon erfolgen. Sie sollten auch darüber nachdenken, den Schlüssel aufzubewahren, damit Sie nach einem Neustart des Programms immer noch über denselben Schlüssel verfügen. Andernfalls werden alle ausgegebenen Token nach dem Neustart ungültig.
Verifizierung bedeutet, dass Sie die Token-Signatur anhand desselben Schlüssels überprüfen, der zum Signieren verwendet wurde.
Das obige ist der detaillierte Inhalt vonEin Fehler ist aufgetreten. Die JWT-Gültigkeit kann nicht behauptet werden und sollte nicht als vertrauenswürdig eingestuft werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!