Skip to content

Commit abb9e6b

Browse files
authored
Merge pull request #53 from mdemille/master
Add an encode method that accepts a `Supplier<Header>` so any Header class can be provided
2 parents 2fe8c5c + 6253ac6 commit abb9e6b

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

src/main/java/io/fusionauth/jwt/JWTEncoder.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.List;
2626
import java.util.Objects;
2727
import java.util.function.Consumer;
28+
import java.util.function.Supplier;
2829

2930
/**
3031
* @author Daniel DeGroff
@@ -41,6 +42,24 @@ public String encode(JWT jwt, Signer signer) {
4142
return encode(jwt, signer, h -> h.set("kid", signer.getKid()));
4243
}
4344

45+
/**
46+
* Encode the JWT to produce a dot separated encoded string that can be sent in an HTTP request header.
47+
*
48+
* @param jwt The JWT.
49+
* @param signer The signer used to add a signature to the JWT.
50+
* @param supplier A header supplier to optionally add header values to the encoded JWT. May be null.
51+
* @return the encoded JWT string.
52+
*/
53+
public String encode(JWT jwt, Signer signer, Supplier<Header> supplier) {
54+
final Header header;
55+
if (supplier != null) {
56+
header = supplier.get();
57+
} else {
58+
header = new Header();
59+
}
60+
return encode(jwt, signer, header);
61+
}
62+
4463
/**
4564
* Encode the JWT to produce a dot separated encoded string that can be sent in an HTTP request header.
4665
*
@@ -50,14 +69,18 @@ public String encode(JWT jwt, Signer signer) {
5069
* @return the encoded JWT string.
5170
*/
5271
public String encode(JWT jwt, Signer signer, Consumer<Header> consumer) {
53-
Objects.requireNonNull(jwt);
54-
Objects.requireNonNull(signer);
55-
56-
List<String> parts = new ArrayList<>(3);
5772
Header header = new Header();
5873
if (consumer != null) {
5974
consumer.accept(header);
6075
}
76+
return encode(jwt, signer, header);
77+
}
78+
79+
private String encode(JWT jwt, Signer signer, Header header) {
80+
Objects.requireNonNull(jwt);
81+
Objects.requireNonNull(signer);
82+
83+
List<String> parts = new ArrayList<>(3);
6184
// Set this after we pass the header to the consumer to ensure it isn't tampered with, only the signer can set the algorithm.
6285
header.algorithm = signer.getAlgorithm();
6386
parts.add(base64Encode(Mapper.serialize(header)));

src/test/java/io/fusionauth/jwt/JWTTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -563,9 +563,12 @@ public void test_complexPayload() {
563563
Signer signer = HMACSigner.newSHA256Signer("secret");
564564
Verifier verifier = HMACVerifier.newVerifier("secret");
565565

566-
String encodedJWT = JWT.getEncoder().encode(expectedJWT, signer, header -> header
567-
.set("gty", Collections.singletonList("client_credentials"))
568-
.set("kid", "1234"));
566+
String encodedJWT = JWT.getEncoder().encode(expectedJWT, signer, () -> {
567+
final Header header = new Header();
568+
header.set("gty", Collections.singletonList("client_credentials"));
569+
header.set("kid", "1234");
570+
return header;
571+
});
569572
JWT actualJwt = JWT.getDecoder().decode(encodedJWT, verifier);
570573

571574
assertEquals(actualJwt.header.algorithm, Algorithm.HS256);

0 commit comments

Comments
 (0)