1

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 令牌无效签名
JWT 令牌无效签名

4

2 回答 2

3

您的问题类似于此https://stackoverflow.com/a/38269014/6371459

这是由于.signWith(SignatureAlgorithm.HS256, "secret")。它由 DefaultJwtBuilder 类实现

public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) 

此方法假定您提供的是 base64 中的密钥,而secret不是 base64。当方法解码base64jjwtbyte[]使用的 java 转换器时,它提供的字符串表示不同于jwt.io使用的 JavaScript 解码器secr

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());
于 2018-01-11T08:54:12.393 回答
0

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

试试这个 Lib 再检查一次,也许这对你有帮助:

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

于 2018-01-11T07:56:12.180 回答