如何发送对象作为JSON Web令牌的一部分?

时间:2019-10-07 23:29:40

标签: java jwt jjwt

我正在尝试使用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\"}"
}

2 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow!

在即将发布的JJWT 0.11.0版本中使用Jackson时,JJWT将本地支持此功能(您也可以阅读docs for this feature)。但是在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);

答案 1 :(得分: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()