JWT签名不匹配本地计算的签名
问题描述:
JwtBuilder builder = Jwts.builder()
.setId(user.getEmail())
.signWith(signatureAlgorithm, signingKey);
创建一个令牌,然后
Jwts.parser().setSigningKey(secret).parse(token);
进行身份验证。当我在JUnit测试中运行它时,它工作正常。但是,当我通过REST调用将标记传递为标头时,身份验证会因SignatureException而失败。我已经验证了HTTP调用两端的令牌,并且令牌字符串是相同的。创建/验证的代码是静态的,因此每个方面的秘密都是一样的。任何线索
答
static Key secret = MacProvider.generateKey();
会产生你的服务器被重新加载一个新的随机密钥,每次因为当类被加载
这意味着,如果你发出一个智威汤逊,它只是只要有效静态变量初始化服务器不重新启动。你得到了SignatureException
是因为签名密钥是不同
您需要的签名密钥存储secret.getEncoded()
第一代后,当你的模块开始
加载难道您发布令牌的例子和密钥? – pedrofb
static key = MacProvider.generateKey(); SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte [] apiKeySecretBytes = secret.getEncoded(); Key signingKey = new SecretKeySpec(apiKeySecretBytes,signatureAlgorithm.getJcaName()); – stanlick