0

我正在尝试使用 jjwt 库创建一个 Web 令牌,但我不知道如何将对象作为声明之一发送。如果我解析对象或手动创建字符串,则整个字符串将作为值而不是单独的 JSON 对象传入。例如,我想发送如下所示的内容:

{
    "iss": "NQoFK1NLVelFWOBQtQ8A",
    "iat": 1511963669,
    "user": {
        "id": "exampleuser",
        "email": "example@mail.com",
        "name": "A User",
    }
}

但我所能创造的只是:

{
    "iss": "NQoFK1NLVelFWOBQtQ8A",
    "iat": 1511963669,
    "user": "{\"id\": \"example@mail.com\",\"email\": \"example@mail.com\",\"name\": \"A User\"}"
}
4

2 回答 2

1

欢迎来到 StackOverflow!

在即将发布的 JJWT 0.11.0 版本中使用 Jackson 时,JJWT 将原生支持此功能(您也可以阅读此功能的文档)。但它在 0.10.X 及更早版本中本机不可用。

在 0.11.0 之前,假设您使用的是 Jackson,您必须自己使用 ObjectMapper 手动执行此操作:

// when creating:
User user = getUser();
ObjectMapper objectMapper = new ObjectMapper(); // or use an existing one
String json = objectMapper.writeValueAsString(user);
byte[] bytes = json.getBytes(StandardCharsets.UTF_8)
String base64 = Encoders.BASE64.encode(bytes);
String jws = Jwts.builder()
  ...
  .claim("userJsonBase64", base64)
  ...
  .compact();

//when parsing:
String userJsonBase64 = Jwts.parser()....parseClaimsJws(jws).getBody().get("userJsonBase64", String.class);
bytes = Decoders.BASE64.decode(userJsonBase64);
json = new String(bytes, StandardCharsets.UTF_8);
user = objectMapper.readValue(json, User.class);
于 2019-10-08T16:32:03.097 回答
0

感谢您的回答,一旦可用,这将是一个很好的功能。我想跟进并发布我发现的解决方法,以防它同时帮助其他人。我能够使用 Java HashMap 创建所需的 JSON(我发现 Scala Map 不起作用的困难方式),然后将其作为声明的值传递:

val user: util.Map[String, String] = new util.HashMap[String,
String]() user.put("id", email.value) user.put("email", email.value)
user.put("name", name.displayName)

...

val jws: String = Jwts.builder()
.claim("user", user)
.signWith(key).compact()
于 2019-10-09T18:18:44.777 回答