【问题标题】: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 总是一个好方法,就是说:一个在初始声明后不能改变的变量。

标签: java spring security spring-security jwt


【解决方案1】:
private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

效果很好。

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 2021-11-02
    • 2020-05-25
    • 2019-12-09
    • 2017-11-19
    • 2019-11-01
    • 2012-10-01
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多