生成和验证相同令牌时的签名异常
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);
效果很好。
【讨论】:
以上是关于生成和验证相同令牌时的签名异常的主要内容,如果未能解决你的问题,请参考以下文章