3

我尝试创建 JWT 令牌

final String jws = Jwts.builder()
            .claim("rainId", rainId.toString())
            .signWith(SignatureAlgorithm.HS256, TextCodec.BASE64.decode("jwtSecretKey"))
            .compact();

然后我尝试解析它

Jws<Claims> jwsClaims = Jwts.parser()
                .require("rainId", rainId.toString())
                .setSigningKey(TextCodec.BASE64.decode("jwtSecretKey1"))
                .parseClaimsJws(jws);

正如您所看到SigningKey的略有不同,所以我预计解析器会失败,但它不会发生。只有SigningKey在解析器中有很大差异时才会发生这种情况。例如“jwtSecretKey111111111111111111111111111111”或“dsfdsfdsfdsfds”。SigningKey如果解析器略有不同,有人可以解释为什么解析器不会失败吗?

我用

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt</artifactId>
  <version>0.9.1</version>
</dependency>
4

1 回答 1

3

您似乎没有正确使用 API。

signWith()和方法都setSigningKey()需要一个 Base64 编码的字符串作为输入。但是您正在调用TextCodec.BASE64.decode("...").

两者都jwtSecretKey不像jwtSecretKey1Base64 编码的字符串。但是,如果您尝试解码它们,它们将产生相同的输出

System.out.println(Arrays.toString(TextCodec.BASE64.decode("jwtSecretKey")));
System.out.println(Arrays.toString(TextCodec.BASE64.decode("jwtSecretKey1")));
[-113, 11, 82, 121, -54, -34, -76, -89, -78]
[-113, 11, 82, 121, -54, -34, -76, -89, -78]

这就是签名验证不会失败的原因。

您应该TextCodec.BASE64.encode("...")改用,如下所示:

String jws = Jwts.builder()
        .claim("rainId", rainId.toString())
        .signWith(SignatureAlgorithm.HS256, TextCodec.BASE64.encode("jwtSecretKey"))
        .compact();

Jws<Claims> jwsClaims = Jwts.parser()
        .require("rainId",rainId.toString())
        .setSigningKey(TextCodec.BASE64.encode("jwtSecretKey1"))
        .parseClaimsJws(jws);
于 2018-10-03T09:48:54.717 回答