Java jjwt为JWT创建无效的JSON

时间:2017-02-27 21:48:50

标签: java jwt jjwt

我一定错过了什么。我正在使用JJWT库来创建JWT。根据声明中设置的数据,JWT与库的创建不一致。我的代码:

UITableViewAutomaticDimension

此代码创建一个JWT并正确签名。但是,当有效载荷被解码时,有效载荷值并不总是有效的JSON。大多数情况下它会丢失关闭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(); ,导致任何解析失败。 如果}是8个字符,则可以正常工作。如果长度为7或6个字符,则它是无效的JSON。或者,如果我在声明中添加其他标记,有时它会起作用,有时它也不会。难道我做错了什么?

我也尝试过使用Auth0 java-JWT库并得到类似的结果,Payload并不总是有效的JSON。

2 个答案:

答案 0 :(得分:1)

请代替JSONObject尝试Map<String,String>

答案 1 :(得分:1)

最终,我无法让 JJWT 库按照我想要的方式工作。因此,我手动实现了一个简单的散列算法和 jwt 创建者。这是它的样子:

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