【发布时间】:2017-07-18 16:39:47
【问题描述】:
我一定错过了什么。我正在使用 JJWT 库来创建 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 并对其进行正确签名。但是,当负载被解码时,负载值并不总是有效的 JSON。大多数情况下,它缺少结束 } 导致任何解析失败。
如果Subject 是 8 个字符,则可以正常工作。如果是 7 或 6 个字符,则为无效 JSON。或者,如果我在声明中添加其他标签,有时它会起作用,有时它不会。难道我做错了什么?
我也尝试过使用 Auth0 java-JWT 库并得到类似的结果,Payload 并不总是有效的 JSON。
【问题讨论】:
-
试试
claims.put("services", jsonObject.toString ());或使用Map。 -
JSONObject使用什么库?可能是将 JSON 对象编码为字符串的问题。 -
尝试
.toString()没有帮助。我使用 net.sf.json-lib 作为库。我认为手动构建令牌更容易,然后仍然通过库验证它们,而不是更多地与之抗争。感谢您的帮助