JWT令牌化让我发疯或者我错了。
要测试并开始使用" jjwt",我正在创建一个简单的jwt令牌,下面是代码。
static String createSimpleJWT() {
String id, issuer, subject;
id="id";
issuer="issuer";
subject="subject";
//Let's set the JWT Claims
JwtBuilder builder = Jwts.builder().setId(id)
.setSubject(subject)
.setIssuer(issuer)
.signWith(SignatureAlgorithm.HS256, "signingKey"); //plz note signing key on this line
return builder.compact();
}
jwt令牌是
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJpZCIsInN1YiI6InN1YmplY3QiLCJpc3MiOiJpc3N1ZXIifQ._7QGamE-HvREDMJIgbfKEIRv76ZaxwIx2t3RaViSYzth4
按照预期,在后续执行中我也得到相同的JWT。
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJpZCIsInN1YiI6InN1YmplY3QiLCJpc3MiOiJpc3N1ZXIifQ._7QGE-HvREDMJIgbfKEIRv76ZaxwIx2t3RaViSYzth4
我正在使用jwt.io对其进行解码以进行测试 - 但令人惊讶的是,尽管在解码部分提供了正确的签名密钥,但jwt令牌仍然带有无效签名。
这是jwt.io截图 - jwt.io-invalidsignature
任何指针......它被搞乱了。
这篇文章不同于早些时候用户忘记或不知道向jwt.io提供签名密钥的地方
PHP JWT Token Invalid Signature
JWT Token Invalid Signature
答案 0 :(得分:0)
我对这个JWT lib几乎有同样的问题所以我把它改成了另一个。不知道为什么会这样。我的应用程序用于对第三方系统进行身份验证。
试试这个Lib再次检查一下,也许这可以帮到你:
答案 1 :(得分:0)
您的问题与此https://stackoverflow.com/a/38269014/6371459类似。
归功于
实现.signWith(SignatureAlgorithm.HS256, "secret")
。它由DefaultJwtBuilder类public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey)
此方法假定您在base64中提供密钥,
secret
不是base64 。当方法从base64
解码为byte[]
时, jjwt 使用的java转换器提供了字符串secr
的表示,该字符串与<强> jwt.io 强>
JWTBuilder.signWith
需要base64编码密钥,但您提供的是纯文本,因此:
在jwt.io中插入“signingK”并检查“secret base64 encoded”
提供base64编码密码
-
String signingKeyB64= Base64.getEncoder().encodeToString("signingKey".getBytes("utf-8"));
JwtBuilder builder = Jwts.builder().setId(id)
.setSubject(subject)
.setIssuer(issuer)
.signWith(SignatureAlgorithm.HS256, signingKeyB64);
我建议生成随机密码而不是使用固定字符串
Key key = MacProvider.generateKey();
String signingKeyB64 = Base64.getEncoder().encodeToString(key.getEncoded());