JWT解码即使在提供正确的"签名"键

时间:2018-01-11 07:46:24

标签: json jwt tokenize jjwt

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

2 个答案:

答案 0 :(得分:0)

我对这个JWT lib几乎有同样的问题所以我把它改成了另一个。不知道为什么会这样。我的应用程序用于对第三方系统进行身份验证。

试试这个Lib再次检查一下,也许这可以帮到你:

https://github.com/auth0/java-jwt

答案 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());