我在用
JwtBuilder builder = Jwts.builder()
.setId(user.getEmail())
.signWith(signatureAlgorithm, signingKey);然后创建一个令牌
Jwts.parser().setSigningKey(secret).parse(token);来验证身份。当我在JUnit测试中运行它时,它工作得很好。但是,当我通过REST调用验证作为报头传递的令牌时,身份验证在SignatureException中失败。我已经验证了HTTP调用两端的令牌,令牌字符串是相同的。创建/身份验证的代码是静态的,因此,双方的秘密是相同的。
发布于 2017-02-22 19:05:05
每次重新加载服务器时,static Key secret = MacProvider.generateKey();都会生成一个新的随机密钥,因为静态变量是在类加载时初始化的。
这意味着,如果您发出一个JWT,它只有在服务器不重新启动的情况下才有效。您得到的SignatureException是因为它的签名密钥不同。
您需要在第一代之后存储签名密钥secret.getEncoded(),并在模块启动时加载它。
发布于 2019-09-19 16:10:00
我也遇到了同样的问题,我注意到在源代码中,每当他们转换签名密钥时,都会显式地指定UTF-8编码。在对令牌进行解码时,我尝试更改编码:
private Jws<Claims> decodeToken(String token) {
return Jwts.parser()
.setSigningKey(securityProperties.getTokenSecret().getBytes(Charset.forName("UTF-8")))
.parseClaimsJws(token);
}在签署令牌时:
private String getSignedToken(UserDetailsAdapter user, List<String> roles, byte[] signingKey) {
return Jwts.builder()
.signWith(Keys.hmacShaKeyFor(signingKey), SignatureAlgorithm.HS512)
.setHeaderParam("typ", securityProperties.getTokenType())
.setIssuer(guiServerSecurityProperties.getTokenIssuer())
.setAudience(guiServerSecurityProperties.getTokenAudience())
.setSubject(user.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + 864000000))
.claim("rol", roles)
.compact();
}这是唯一能帮我解决这个问题的东西。
发布于 2019-05-22 09:28:45
我也有过类似的问题。在我的例子中,这是错误的令牌验证。我将符号设置为字节:
.signWith(SignatureAlgorithm.HS512, jwtConfig.getSecret().getBytes())但是,当我解析令牌并设置signKey时,我将其设置为字符串,而不是字节:
Jwts.parser().setSigningKey(signingKey).parseClaimsJws(this.token)此外,在检查令牌时,始终要检查引号和空格,令牌的开头/结尾经常会有多余的空格/引号(使用trim()方法)
https://stackoverflow.com/questions/42397484
复制相似问题