У меня есть строка JSON (созданная Джексоном для преобразования объекта):
String my_JSON_String = {"id":-1,"id_contratto":1,"datetime_inizio":"2018-09-15 17:44:02","datetime_fine":null,"numero_chiamate_individuali":-1,"minuti_totali_chiamate_individuali":1421,"numero_chiamate_gruppo":3027,"minuti_totali_chiamate_gruppo":-1,"numero_messaggi_individuali_testo":-1,"numero_messaggi_individuali_multimediali":-1,"numero_messaggi_gruppo_testo":-1,"numero_messaggi_gruppo_multimediali":-1,"numero_eventi_inviati":-1,"numero_interventi_creati":-1,"enabled":false}
Я должен поместить эту строку в настраиваемое поле под названием «DATI» утверждения JWT. Я использую:
JwtBuilder MY_JwtBuilder = Jwts.builder()
.setIssuedAt( new Date() )
.setIssuer("Fausto")
.setSubject("Ciao")
.claim("DATI", my_JSON_String )
.signWith(SignatureAlgorithm.HS256, "DonalDuck");
String JWT= MY_JwtBuilder.compact();
Если я тестирую JWT, помещая его в https://jwt.io/, я получаю следующую строку:
{
"iat": 1537026243,
"iss": "Fausto",
"sub": "Ciao",
"DATI": "{\"id\":-1,\"id_contratto\":1,\"datetime_inizio\":\"2018-09-15 17:44:02\",\"datetime_fine\":null,\"numero_chiamate_individuali\":-1,\"minuti_totali_chiamate_individuali\":1421,\"numero_chiamate_gruppo\":3027,\"minuti_totali_chiamate_gruppo\":-1,\"numero_messaggi_individuali_testo\":-1,\"numero_messaggi_individuali_multimediali\":-1,\"numero_messaggi_gruppo_testo\":-1,\"numero_messaggi_gruppo_multimediali\":-1,\"numero_eventi_inviati\":-1,\"numero_interventi_creati\":-1,\"enabled\":false}",
"exp": 1537029843
}
Для каждой кавычки в поле DATI был добавлен \. Это проблема на стороне веб-сайта. Как избежать добавления \?
Спасибо, Фаусто
Я думаю, что первая строка не может быть вашим настоящим кодом, это не строка. Я полагаю, вы производите его с помощью JSONObject.getString() или чего-то подобного, или вы пропустили прилагаемый "", верно ?!




Вы можете использовать String#replaceAll() с шаблоном ^\"|\"$
Например.
String JWT = MY_JwtBuilder.compact().replaceAll("^\"|\"$", "");
JWT зашифрован, это что-то вроде "eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzcwMjczMjcsImlzcyI6Imh0dH A6Ly9mcDJ0ZWNoLml0Ly IsInN1YiI6IkVUSVAvbn VsbCIsIkRBVEkiOiJ7J2 lkJzotMSwnaWRfY29udH JhdHRvJzoyLCdkYXRldG ltZV9pbml6aW8nOicyMD E4LTA5LTE1IDE4OjAyOj A3JywnZGF0ZXRpbWVfZm luZSc6bnVsbCwnbnVtZX JvX2NoaWFtYXRlX2luZG l2aWR1YWxpJzotMSwnbW ludXRpX3RvdGFsaV9jaG lhbWF0ZV9pbmRpdmlkdW FsaSc6Mjk4MCwnbnVtZX JvX2NoaWFtYXRl ...."; подстановка в зашифрованной строке не имеет никакого смысла.
Проблема здесь в том, что вы уже создали строку из своего объекта DATI.
JWTBuilder обрабатывает его как строку и экранирует " внутри с помощью \.
Вместо того, чтобы создавать JSON-String самостоятельно, создайте объект JSON и передайте этот объект в качестве параметра в claim, и пусть JWTBuilder позаботится о правильной сериализации этого объекта,
например.:
JSONObject datiClaim = new JSONObject();
datiClaim.put("id", -1);
datiClaim.put("id_contratto", 1);
...
JwtBuilder MY_JwtBuilder = Jwts.builder()
.setIssuedAt( new Date() )
.setIssuer("Fausto")
.setSubject("Ciao")
.claim("DATI", datiClaim )
....
Я попробую, но в этом случае у меня другая проблема: есть ли способ создать JSONObject с помощью универсального объекта? Я имею в виду, что объект, который я должен отправить в JWT, мог принадлежать к разным классам. Есть ли способ сделать это? Например, я получаю строку Json от библиотеки Джексона, начиная с любого объекта ... Могу ли я сделать то же самое, чтобы создать объект JSON?
В любом случае, помимо другой проблемы в моем комментарии, ваше решение работает !!!
Согласно документы вторым параметром claim может быть что угодно типа object, поэтому в основном вам даже не нужен JSONObject, но вы можете напрямую передавать любой другой тип объекта.
@jps Это действительно так, спасибо за этот комментарий. Нет необходимости конвертировать его в json, он принимает любой объект Java.
@benjamin c Может быть, ты здесь поможешь?