2017-02-22 600 views
1

我使用JWT签名不匹配本地计算的签名

JwtBuilder builder = Jwts.builder() 
        .setId(user.getEmail()) 
        .signWith(signatureAlgorithm, signingKey); 

创建一个令牌,然后

Jwts.parser().setSigningKey(secret).parse(token); 

进行身份验证。当我在JUnit测试中运行它时,它工作正常。但是,当我通过REST调用将标记传递为标头时,身份验证会因SignatureException而失败。我已经验证了HTTP调用两端的令牌,并且令牌字符串是相同的。创建/验证的代码是静态的,因此每个方面的秘密都是一样的。任何线索

+0

加载难道您发布令牌的例子和密钥? – pedrofb

+0

static key = MacProvider.generateKey(); SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte [] apiKeySecretBytes = secret.getEncoded(); Key signingKey = new SecretKeySpec(apiKeySecretBytes,signatureAlgorithm.getJcaName()); – stanlick

回答

2

static Key secret = MacProvider.generateKey();会产生你的服务器被重新加载一个新的随机密钥,每次因为当类被加载

这意味着,如果你发出一个智威汤逊,它只是只要有效静态变量初始化服务器不重新启动。你得到了SignatureException是因为签名密钥是不同

您需要的签名密钥存储secret.getEncoded()第一代后,当你的模块开始

+0

伟大的观察。但是,我在服务器上有一个实用程序类,它是对此静态密钥的唯一引用。它使用这个单一的参考进行创建和认证操作。这就是为什么它很混乱。 – stanlick

+0

只需检查是否存在其他隐藏问题:您是否可以在签署和验证之前打印关键内容? E.g'System.out.println(DatatypeConverter.printHexBinary(secret.getEncoded()))' – pedrofb

+0

@stanlick,您是否在签名和验证时检查密码是否相同? – pedrofb