我遇到的问题是,无论何时签署令牌,我都会解析它并且不会抛出任何签名异常。
你可以看到钥匙不同,它仍然给我正确的反应。
public class JwtUtil {
public String parseToken(String token) {
try {
Jws<Claims> jwt = Jwts.parser()
.setSigningKey("Test@12")
.parseClaimsJws(token);
System.out.println(jwt.getBody().getSubject());
return "Valid";
} catch (SignatureException jwtException) {
jwtException.printStackTrace();
return null;
}
}
public String generateToken() {
Claims claim = Jwts.claims();
claim.put("GivenName", "Johnny");
claim.put("Surname", "Rocket");
claim.put("Email", "jrocket@example.com");
return Jwts.builder().setHeaderParam("typ", "JWT").setClaims(claim)
.setIssuer("Online JWT Builder")
.setAudience("www.example.com").setSubject("jrocket@example.com")
.signWith(SignatureAlgorithm.HS256, "Test@123").compact();
}
public static void main(String[] args) {
JwtUtil jwtUtil = new JwtUtil();
String token = jwtUtil.generateToken();
System.out.println(token);
JwtUtil jwtUtil1 = new JwtUtil();
jwtUtil1.parseToken(token);
}
}
答案 0 :(得分:1)
真的 Test@12
和 Test@123
是相同的密钥
归功于JwtBuilder.signWith(SignatureAlgorithm alg, String base64EncodedSecretKey)
。假设您在base64中提供了一个密钥,而您的密钥不是base64。当方法从base64
解码为byte[]
时,jjwt
使用的java转换器提供字符串的表示。 Test@12
和Test@123
使用字节数组
请参阅https://stackoverflow.com/a/38269014/6371459
您可以使用
进行自我测试System.out.println(
javax.xml.bind.DatatypeConverter.printBase64Binary(
javax.xml.bind.DatatypeConverter.parseBase64Binary("Test@12")));
System.out.println(
javax.xml.bind.DatatypeConverter.printBase64Binary(
javax.xml.bind.DatatypeConverter.parseBase64Binary("Test@123")));
尝试(更多)不同的密钥,SignatureException
将被抛出