我在用
JwtBuilder builder = Jwts.builder()
.setId(user.getEmail())
.signWith(signatureAlgorithm, signingKey);
然后创建一个令牌
Jwts.parser().setSigningKey(secret).parse(token);
进行验证。当我在 JUnit 测试中运行它时,它工作正常。但是,当我对通过 REST 调用作为标头传递的令牌进行身份验证时,身份验证失败并出现 SignatureException。我已经验证了 HTTP 调用两端的令牌并且令牌字符串是相同的。创建/验证的代码是静态的,因此,每一方的秘密都是相同的。
原文由 stanlick 发布,翻译遵循 CC BY-SA 4.0 许可协议
static Key secret = MacProvider.generateKey();
每次重新加载服务器时都会生成一个新的随机密钥,因为加载类时会初始化静态变量这意味着如果你发出一个 JWT,它只在服务器不重启时有效。您得到的
SignatureException
是因为签名密钥不同您需要在第一代之后存储签名密钥
secret.getEncoded()
并在模块启动时加载它