1package dev.rafex.ether.jwt.internal;
3import java.nio.charset.StandardCharsets;
4import java.util.Base64;
32import com.fasterxml.jackson.databind.JsonNode;
33import com.fasterxml.jackson.databind.ObjectMapper;
34import com.fasterxml.jackson.databind.node.ObjectNode;
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;
87 ParsedJwt(
final String encodedHeader,
final String encodedPayload,
final String encodedSignature,
88 final JsonNode header,
final JsonNode payload) {
89 this.encodedHeader = encodedHeader;
90 this.encodedPayload = encodedPayload;
91 this.encodedSignature = encodedSignature;
93 this.payload = payload;
96 public String encodedHeader() {
100 public String encodedPayload() {
101 return encodedPayload;
104 public String encodedSignature() {
105 return encodedSignature;
108 public JsonNode header() {
112 public JsonNode payload() {
116 public String signingInput() {
117 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)