Java JWT为JWT创建无效的JSON

Java JWT为JWT创建无效的JSON,java,jwt,jjwt,Java,Jwt,Jjwt,我一定错过了什么。我正在使用JWT库创建JWT。JWT是根据声明中的数据集从库中不一致地创建的。我的代码: Date now = new Date(); Date expiration = new Date(now.getTime() + TimeUnit.MINUTES.toMillis(30)); Claims claims = Jwts.claims(); JSONObject jsonObject = new JSONObject(); jsonObject.put("service

我一定错过了什么。我正在使用JWT库创建JWT。JWT是根据声明中的数据集从库中不一致地创建的。我的代码:

Date now = new Date();
Date expiration = new Date(now.getTime() + TimeUnit.MINUTES.toMillis(30));

Claims claims = Jwts.claims();

JSONObject jsonObject = new JSONObject();
jsonObject.put("serviceName1", "serviceStatus1");
jsonObject.put("serviceName2", "serviceStatus2");
claims.put("services",jsonObject);

claims.setSubject("225544");
claims.setExpiration(expiration);
claims.setId(UUID.randomUUID().toString());
claims.setIssuedAt(now);

return Jwts.builder()
    .setClaims(claims)
    .signWith(SignatureAlgorithm.HS256, Base64.encodeBase64(secret.getBytes()))
    .compact();
这段代码创建了一个JWT并对其进行了正确的签名。但是,当有效负载被解码时,有效负载值并不总是有效的。最常见的情况是,它缺少结束符
}
,导致对它的任何解析都失败。 如果
主题
为8个字符,则可以正常工作。如果长度为7或6个字符,则为无效JSON。或者如果我在声明中添加其他标签,有时有效,有时无效。我做错什么了吗


我也尝试过使用auth0javajwt库,得到了类似的结果,但负载并不总是有效的JSON

请不要
JSONObject
尝试
Map

请不要
JSONObject
尝试
Map
最终,我无法让JJWT库按我想要的方式工作。因此,我手动实现了一个简单的哈希算法和jwt creator。下面是它的样子:

    Date now = new Date();
    //Valid only for 30 minutes
    Date expiration = new Date(now.getTime() + TimeUnit.MINUTES.toMillis(30));

    JSONObject header = new JSONObject();
    JSONObject payload = new JSONObject();

    header.put("alg", "HS256");

    payload.put("sub", "ourSubject");
    payload.put("exp", expiration.getTime() / 1000);
    payload.put("jti", UUID.randomUUID().toString());
    payload.put("iat", now.getTime() / 1000);
    payload.put("services", "JSON object of our custom data needed in authorization (not authentication");
    String signature = "";

    StringBuilder token = new StringBuilder();
    token.append(new String(Base64.encodeBase64(header.toString().getBytes())));
    token.append(".");
    token.append(new String(Base64.encodeBase64(payload.toString().getBytes())));
    try {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(Base64.encodeBase64((secret + otherPartOfSecret).getBytes()), "HmacSHA256");
        sha256_HMAC.init(secret_key);

        signature = new String(Base64.encodeBase64(sha256_HMAC.doFinal(token.toString().getBytes())));
    } catch (Exception e) {
        System.out.println("Error");
    }

    token.append(".");
    token.append(signature);

    return token.toString();

最终,我无法让JJWT库按我想要的方式工作。因此,我手动实现了一个简单的哈希算法和jwt creator。下面是它的样子:

    Date now = new Date();
    //Valid only for 30 minutes
    Date expiration = new Date(now.getTime() + TimeUnit.MINUTES.toMillis(30));

    JSONObject header = new JSONObject();
    JSONObject payload = new JSONObject();

    header.put("alg", "HS256");

    payload.put("sub", "ourSubject");
    payload.put("exp", expiration.getTime() / 1000);
    payload.put("jti", UUID.randomUUID().toString());
    payload.put("iat", now.getTime() / 1000);
    payload.put("services", "JSON object of our custom data needed in authorization (not authentication");
    String signature = "";

    StringBuilder token = new StringBuilder();
    token.append(new String(Base64.encodeBase64(header.toString().getBytes())));
    token.append(".");
    token.append(new String(Base64.encodeBase64(payload.toString().getBytes())));
    try {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(Base64.encodeBase64((secret + otherPartOfSecret).getBytes()), "HmacSHA256");
        sha256_HMAC.init(secret_key);

        signature = new String(Base64.encodeBase64(sha256_HMAC.doFinal(token.toString().getBytes())));
    } catch (Exception e) {
        System.out.println("Error");
    }

    token.append(".");
    token.append(signature);

    return token.toString();

尝试
claims.put(“services”,jsonObject.toString())
或使用
映射
。您在
JSONObject
中使用的库是什么?将JSON对象编码为字符串可能有问题。尝试
.toString()
没有帮助。我使用net.sf.json-lib作为库。我决定手动构建令牌,然后仍然通过库验证它们,而不是更多地与之抗争。感谢您的帮助try
claims.put(“services”,jsonObject.toString())
或使用
映射
。您在
JSONObject
中使用的库是什么?将JSON对象编码为字符串可能有问题。尝试
.toString()
没有帮助。我使用net.sf.json-lib作为库。我决定手动构建令牌,然后仍然通过库验证它们,而不是更多地与之抗争。谢谢你的帮助