首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java jjwt为JWT创建无效的JSON

Java jjwt为JWT创建无效的JSON
EN

Stack Overflow用户
提问于 2017-02-27 21:48:49
回答 3查看 1.7K关注 0票数 0

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

代码语言:javascript
复制
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并正确地对其签名。但是,当有效负载被解码时,有效负载值并不总是有效的JSON。最常见的情况是,它缺少关闭的},导致对它的任何解析都失败。如果Subject是8个字符,它可以正常工作。如果它有7个或6个字符长,则它是无效的JSON。或者,如果我在声明中添加了其他标签,有时是有效的,有时则不是。我是不是做错了什么?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-07 17:42:56

最终,我无法让JJWT库以我想要的方式工作。因此,我手动实现了一个简单的散列算法和jwt创建者。如下所示:

代码语言:javascript
复制
    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();
票数 1
EN

Stack Overflow用户

发布于 2017-03-07 15:09:35

请不要选择JSONObject,试试Map<String,String>

票数 2
EN

Stack Overflow用户

发布于 2022-03-24 21:31:33

您可以使用toMap()方法解决此问题。

然后,示例中的代码将如下所示:

代码语言:javascript
复制
JSONObject jsonObject = new JSONObject();
jsonObject.put("serviceName1", "serviceStatus1");
jsonObject.put("serviceName2", "serviceStatus2");
claims.put("services",jsonObject.toMap());

这将导致JWT中的以下声明。

代码语言:javascript
复制
"services": {
    "serviceName1": "serviceStatus1",
    "serviceName2": "serviceStatus2"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42496388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档