Skip to content

Commit b8c91b7

Browse files
committed
Preserve insertion order for JSON claims
1 parent d713cec commit b8c91b7

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

lib/src/main/java/com/auth0/jwt/JWTCreator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public Builder withHeader(String headerClaimsJson) throws IllegalArgumentExcepti
112112
}
113113

114114
try {
115-
Map<String, Object> headerClaims = mapper.readValue(headerClaimsJson, HashMap.class);
115+
Map<String, Object> headerClaims = mapper.readValue(headerClaimsJson, LinkedHashMap.class);
116116
return withHeader(headerClaims);
117117
} catch (JsonProcessingException e) {
118118
throw new IllegalArgumentException("Invalid header JSON", e);
@@ -508,7 +508,7 @@ public Builder withPayload(String payloadClaimsJson) throws IllegalArgumentExcep
508508
}
509509

510510
try {
511-
Map<String, Object> payloadClaims = mapper.readValue(payloadClaimsJson, HashMap.class);
511+
Map<String, Object> payloadClaims = mapper.readValue(payloadClaimsJson, LinkedHashMap.class);
512512
return withPayload(payloadClaims);
513513
} catch (JsonProcessingException e) {
514514
throw new IllegalArgumentException("Invalid payload JSON", e);

lib/src/test/java/com/auth0/jwt/JWTCreatorTest.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.auth0.jwt.algorithms.Algorithm;
44
import com.auth0.jwt.interfaces.ECDSAKeyProvider;
55
import com.auth0.jwt.interfaces.RSAKeyProvider;
6-
import com.fasterxml.jackson.core.JsonProcessingException;
76
import com.fasterxml.jackson.databind.ObjectMapper;
87
import com.fasterxml.jackson.databind.node.ObjectNode;
98
import org.junit.Rule;
@@ -974,7 +973,7 @@ public void withPayloadShouldSupportJsonValueWithNestedDataStructure() {
974973
.sign(Algorithm.HMAC256("secret"));
975974

976975
assertThat(jwt, is(notNullValue()));
977-
String[] parts = jwt.split("\\.");
976+
String[] parts = jwt.split("\\.") ;
978977
String payloadJson = new String(Base64.getUrlDecoder().decode(parts[1]), StandardCharsets.UTF_8);
979978

980979
assertThat(payloadJson, JsonMatcher.hasEntry("stringClaim", stringClaim));
@@ -1014,16 +1013,21 @@ public void shouldCreatePayloadWithNullForList() {
10141013

10151014
@Test
10161015
public void shouldPreserveInsertionOrder() throws Exception {
1017-
List<String> headerInsertionOrder = new ArrayList<>();
1016+
String taxonomyJson = "{\"class\": \"mammalia\", \"order\": \"carnivora\", \"family\": \"canidae\", \"genus\": \"vulpes\"}";
1017+
List<String> taxonomyClaims = Arrays.asList("class", "order", "family", "genus");
1018+
List<String> headerInsertionOrder = new ArrayList<>(taxonomyClaims);
10181019
Map<String, Object> header = new LinkedHashMap<>();
10191020
for (int i = 0; i < 10; i++) {
10201021
String key = "h" + i;
10211022
header.put(key, "v" + 1);
10221023
headerInsertionOrder.add(key);
10231024
}
10241025

1025-
List<String> payloadInsertionOrder = new ArrayList<>();
1026-
JWTCreator.Builder builder = JWTCreator.init().withHeader(header);
1026+
List<String> payloadInsertionOrder = new ArrayList<>(taxonomyClaims);
1027+
JWTCreator.Builder builder = JWTCreator.init()
1028+
.withHeader(taxonomyJson)
1029+
.withHeader(header)
1030+
.withPayload(taxonomyJson);
10271031
for (int i = 0; i < 10; i++) {
10281032
String name = "c" + i;
10291033
builder = builder.withClaim(name, "v" + i);

0 commit comments

Comments
 (0)