1package dev.rafex.ether.jwt.internal;
29import com.fasterxml.jackson.databind.JsonNode;
30import com.fasterxml.jackson.databind.ObjectMapper;
31import com.fasterxml.jackson.databind.node.ObjectNode;
33import java.nio.charset.StandardCharsets;
34import java.util.Base64;
36public final class JwtCodec {
38 private static final ObjectMapper MAPPER =
new ObjectMapper();
43 public static ParsedJwt
parse(
final String token) {
44 if (token ==
null || token.isBlank()) {
45 throw new IllegalArgumentException(
"token is required");
47 final String[] parts = token.split(
"\\.");
48 if (parts.length != 3) {
49 throw new IllegalArgumentException(
"invalid token format");
54 return new ParsedJwt(parts[0], parts[1], parts[2], header, payload);
58 return Base64.getUrlEncoder().withoutPadding().encodeToString(node.toString().getBytes(StandardCharsets.UTF_8));
62 final ObjectNode header = MAPPER.createObjectNode();
63 header.put(
"alg", alg);
64 header.put(
"typ",
"JWT");
68 public static String
decode(
final String value) {
69 return new String(Base64.getUrlDecoder().decode(value), StandardCharsets.UTF_8);
74 return MAPPER.readTree(
json);
75 }
catch (
final Exception e) {
76 throw new IllegalArgumentException(
"invalid JSON", e);
80 public static final class ParsedJwt {
81 private final String encodedHeader;
82 private final String encodedPayload;
83 private final String encodedSignature;
84 private final JsonNode header;
85 private final JsonNode payload;
88 final String encodedHeader,
89 final String encodedPayload,
90 final String encodedSignature,
91 final JsonNode header,
92 final JsonNode payload) {
93 this.encodedHeader = encodedHeader;
94 this.encodedPayload = encodedPayload;
95 this.encodedSignature = encodedSignature;
97 this.payload = payload;
100 public String encodedHeader() {
101 return encodedHeader;
104 public String encodedPayload() {
105 return encodedPayload;
108 public String encodedSignature() {
109 return encodedSignature;
112 public JsonNode header() {
116 public JsonNode payload() {
120 public String signingInput() {
121 return encodedHeader +
"." + encodedPayload;
static JsonNode readJson(final String json)
static String encodeHeader(final String alg)
static ParsedJwt parse(final String token)
static String encodeJson(final JsonNode node)
static String decode(final String value)