Как я могу отправить объект как часть веб-токена JSON? - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь создать веб-токен с использованием библиотеки jjwt, но не могу понять, как отправить объект в качестве одного из утверждений. Если я анализирую объект или вручную создаю строку, вся строка отображается как значение, а не как отдельный объект 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 голосов
/ 09 октября 2019

Спасибо за ваш ответ, это будет хорошая возможность, как только она станет доступна. Я хотел продолжить и опубликовать найденный мной обходной путь на случай, если в это время он кому-нибудь поможет. Мне удалось создать JSON, в котором я нуждался, с помощью Java HashMap (я выяснил, каким сложным образом не работает карта Scala), а затем передать его в качестве значения утверждения:

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()
0 голосов
/ 08 октября 2019

Добро пожаловать в StackOverflow!

Эта функция будет изначально поддерживаться JJWT при использовании Jackson в следующем выпуске JJWT 0.11.0 (и вы можете прочитать документы для этой функции тоже),Но он не доступен изначально в 0.10.X и более ранних версиях.

До версии 0.11.0 и при условии, что вы используете Джексона, вам придется сделать это вручную с помощью 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);
...