【发布时间】: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 总是一个好方法,就是说:一个在初始声明后不能改变的变量。
标签: java spring security spring-security jwt