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