2017-10-04 218 views
1

我在我的应用程序中使用JWT进行登录验证过程。 要生成我使用的令牌:JWT令牌无效签名

Jwts.builder().setSubject(username).signWith(SignatureAlgorithm.HS512, MacProvider.generateKey()).compact(); 

生成的令牌:

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJlaG91c2VAZGV2ZXJldXgub3JnIn0.5SX-AU-p_RlfC3CZa-YXnQu_YR7RsG2Xfim3LOmlqxjAZrIyZiz0fYZwViHr113ms8TNvngcJcV07U4hK-RBZQ

当我解码此令牌jwt.io调试器告诉我一个无效的Signature。我无法找到此失败的原因,因为我可以在我用于验证的有效负载中看到用户名。有人可以指出我的问题吗?我是否需要更改代码中的任何内容?

+0

您是否提供了'MacProvider.generateKey()'生成的密钥来解码jwt.io中的签名? – lztachyon

回答

1

MacProvider.generateKey()每次使用它时都会生成一个新的随机签名密钥。您需要生成一次并存储它。密钥用于签署和验证令牌。

如果你没有存储密钥,你将无法验证令牌,这正是jwt.io的问题。 您必须提供签名密钥。在你的情况下,使用一个可以包含不可表示字符的随机密钥(也可以使用密码短语,但不推荐),将其编码为base64。然后在jwt.io中标记支票以验证令牌

Key key =MacProvider.generateKey(); 
String keyB64 = javax.xml.DataTypeConverter.printBase64Binary(key.getEncoded()); 
+0

这是有道理的。谢谢。 – Mohit224