生成和验证相同令牌时的签名异常

Posted

技术标签:

【中文标题】生成和验证相同令牌时的签名异常【英文标题】:signature exception when generate and validating the same token 【发布时间】:2020-11-09 14:50:20 【问题描述】:

我编写了一个 jwt 创建器,当我创建令牌时没有问题。但是当我从标题中收到它并检查它时,出现签名异常下面的代码有什么问题?

@Service
public class TokenManager 

    private static final int validity = 5 * 60 * 1000;
    Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    public String generateToken(String afId) 
        return Jwts.builder()
                .setSubject(afId)
                .setIssuer("www.asn.com")
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + validity))
                .signWith(key)
                .compact();
    

    public boolean tokenValidate(String token) 
        return getUsernameToken(token) != null && !isExpired(token);
    

    public String getUsernameToken(String token) 
        Claims claims = getClaims(token);
        return claims.getSubject();
    

    public boolean isExpired(String token) 
        Claims claims = getClaims(token);
        return claims.getExpiration().before(new Date(System.currentTimeMillis()));
    

    private Claims getClaims(String token) 
        return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody(); // SIGNATURE EXCEPTİON occurs
    


【问题讨论】:

很可能会抛出 签名异常,因为 JWT 出现问题。这可能是用于签名的 key (或检查,这仍然相同吗?)或者令牌有其他问题。是否可以更新帖子并显示Claims代码? 实际上声明代码来自 io.jsonwebtoken.Claims ,这是一个 java 库。但是,当我调试密钥时,它会更改每个请求,我该如何保留它?添加 static final 是一个好方法吗? 您可以尝试将其设为 static final,前提是整个 TokenManager 不会在每个请求上重新构建(在 Java 上也有点生疏,所以它可能也需要是私有的,结合静态最终)。对于你不想改变的东西,静态 final 总是一个好方法,就是说:一个在初始声明后不能改变的变量。 【参考方案1】:
private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

效果很好。

【讨论】:

以上是关于生成和验证相同令牌时的签名异常的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer4 令牌签名验证

验证Azure AD令牌签名失败JAVA

使用 java-jwt 验证访问令牌签名

如何生成与 JWT.IO 网站相同的签名?

tymon/jwt-auth Laravel:无法验证令牌签名

签名验证失败。无法匹配“孩子”