editor php Banana menegaskan bahawa apabila menggunakan JWT (Token Web JSON), anda mesti ambil perhatian bahawa kesahihannya tidak boleh ditegaskan dan tidak boleh dipercayai. JWT ialah token yang digunakan untuk pengesahan dan kebenaran, tetapi disebabkan sifatnya yang serba lengkap, apabila token itu diganggu, kesahihannya tidak dapat dijamin. Oleh itu, apabila menggunakan JWT, kita harus mengambil langkah pengesahan yang ketat, termasuk mengesahkan tandatangan, masa tamat tempoh, dsb., dan tidak menyimpan maklumat sensitif dalam JWT untuk mengelakkan risiko keselamatan.
Kod jwtutil.java saya:
@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); } } }
Soalannya ialah:
Caused by: io.jsonwebtoken.security.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
Fungsi anda getsigningkey()
使用 jwts.sig.hs512.key().build();
, yang akan mencipta kunci baharu setiap kali anda memanggilnya.
Tetapi anda menelefon getsigningkey()
apabila anda menandatangani token dan apabila anda mengesahkan token, jadi anda mempunyai kunci yang berbeza dalam kedua-dua kes.
Sebaliknya buat kunci dan simpan dan gunakan kunci yang disimpan. Contohnya:
signingKey = getSigningKey(); // use it for signing Jwts.builder().signWith(signingKey)... // and verification Jwts.parser().verifyWith(signingKey)...
Tetapi penciptaan kunci tidak sepatutnya berlaku setiap kali token dicipta, tetapi harus berasingan daripadanya. Anda juga harus mempertimbangkan untuk mengekalkan kunci supaya anda masih mempunyai kunci yang sama selepas memulakan semula program. Jika tidak, semua token yang dikeluarkan akan menjadi tidak sah selepas dimulakan semula.
Pengesahan bermakna anda mengesahkan tandatangan token terhadap kunci yang sama yang digunakan untuk menandatanganinya.
Atas ialah kandungan terperinci Jatuh dalam kesilapan. Kesahan JWT tidak boleh ditegaskan dan tidak boleh dipercayai. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!