使用Java生成JJWT签名在jwt.io调试器中失败

我正在使用jjwt Java库在servlet上生成jwt的服务器端,直接从jjwt GitHub页面https://github.com/jwtk/jjwt下面的代码片段生成并打印出这个令牌。

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.XIKER3owR8BS3Krhsksg9INh9VBSejdn_qN-ONtPans 
  String compactJws = Jwts.builder() .setSubject("Joe") .signWith(SignatureAlgorithm.HS256, "secret") .compact(); PrintWriter out = response.getWriter(); out.println(compactJws); 

但是,当我尝试在jwt.io的调试器上validation此令牌时,它未通过签名检查。 检查和取消选中秘密base64编码都不起作用

我错误地使用了这个库吗?

尝试使用secr并检查base64选项:)

这是由于.signWith(SignatureAlgorithm.HS256, "secret") 。 它由DefaultJwtBuilder类实现

 public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) 

此方法假定您在base64中提供密钥,而secret不是base64 。 当方法从base64解码为byte[]jjwt使用的java转换器提供了字符串secr的表示,它与jwt.io中使用的JavaScript解码器不同。

你可以测试自己

 System.out.println( javax.xml.bind.DatatypeConverter.printBase64Binary( javax.xml.bind.DatatypeConverter.parseBase64Binary("secret")));