3

我在 servlet 上使用 jjwt Java 库在服务器端生成 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 的调试器上验证此令牌时,签名检查失败。 检查和取消检查秘密 base64 编码都不起作用

我是否错误地使用了图书馆?

4

1 回答 1

3

尝试secr并检查 base64 选项:)

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

public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) 

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

你可以用

System.out.println(
                javax.xml.bind.DatatypeConverter.printBase64Binary(
                        javax.xml.bind.DatatypeConverter.parseBase64Binary("secret")));
于 2016-07-08T14:21:25.320 回答