首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JWT签名与本地计算签名不匹配。

JWT签名与本地计算签名不匹配。
EN

Stack Overflow用户
提问于 2017-02-22 16:47:10
回答 6查看 45.1K关注 0票数 18

我在用

代码语言:javascript
复制
JwtBuilder builder = Jwts.builder()
                    .setId(user.getEmail())
                    .signWith(signatureAlgorithm, signingKey);

然后创建一个令牌

代码语言:javascript
复制
Jwts.parser().setSigningKey(secret).parse(token);

来验证身份。当我在JUnit测试中运行它时,它工作得很好。但是,当我通过REST调用验证作为报头传递的令牌时,身份验证在SignatureException中失败。我已经验证了HTTP调用两端的令牌,令牌字符串是相同的。创建/身份验证的代码是静态的,因此,双方的秘密是相同的。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-02-22 19:05:05

每次重新加载服务器时,static Key secret = MacProvider.generateKey();都会生成一个新的随机密钥,因为静态变量是在类加载时初始化的。

这意味着,如果您发出一个JWT,它只有在服务器不重新启动的情况下才有效。您得到的SignatureException是因为它的签名密钥不同。

您需要在第一代之后存储签名密钥secret.getEncoded(),并在模块启动时加载它。

票数 16
EN

Stack Overflow用户

发布于 2019-09-19 16:10:00

我也遇到了同样的问题,我注意到在源代码中,每当他们转换签名密钥时,都会显式地指定UTF-8编码。在对令牌进行解码时,我尝试更改编码:

代码语言:javascript
复制
 private Jws<Claims> decodeToken(String token) {
        return Jwts.parser()
                .setSigningKey(securityProperties.getTokenSecret().getBytes(Charset.forName("UTF-8")))
                .parseClaimsJws(token);
 }

在签署令牌时:

代码语言:javascript
复制
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();
    }

这是唯一能帮我解决这个问题的东西。

票数 13
EN

Stack Overflow用户

发布于 2019-05-22 09:28:45

我也有过类似的问题。在我的例子中,这是错误的令牌验证。我将符号设置为字节:

代码语言:javascript
复制
.signWith(SignatureAlgorithm.HS512, jwtConfig.getSecret().getBytes())

但是,当我解析令牌并设置signKey时,我将其设置为字符串,而不是字节:

代码语言:javascript
复制
Jwts.parser().setSigningKey(signingKey).parseClaimsJws(this.token)

此外,在检查令牌时,始终要检查引号和空格,令牌的开头/结尾经常会有多余的空格/引号(使用trim()方法)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42397484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档