package com.auth0.jwt.impl; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; public class PayloadSerializer extends StdSerializer<ClaimsHolder> { public PayloadSerializer() { this(null); } private PayloadSerializer(Class<ClaimsHolder> t) { super(t); } @Override public void serialize(ClaimsHolder holder, JsonGenerator gen, SerializerProvider provider) throws IOException { HashMap<Object, Object> safePayload = new HashMap<>(); for (Map.Entry<String, Object> e : holder.getClaims().entrySet()) { switch (e.getKey()) { case PublicClaims.AUDIENCE: if (e.getValue() instanceof String) { safePayload.put(e.getKey(), e.getValue()); break; } String[] audArray = (String[]) e.getValue(); if (audArray.length == 1) { safePayload.put(e.getKey(), audArray[0]); } else if (audArray.length > 1) { safePayload.put(e.getKey(), audArray); } break; case PublicClaims.EXPIRES_AT: case PublicClaims.ISSUED_AT: case PublicClaims.NOT_BEFORE: safePayload.put(e.getKey(), dateToSeconds((Date) e.getValue())); break; default: if (e.getValue() instanceof Date) { safePayload.put(e.getKey(), dateToSeconds((Date) e.getValue())); } else { safePayload.put(e.getKey(), e.getValue()); } break; } } gen.writeObject(safePayload); } private long dateToSeconds(Date date) { return date.getTime() / 1000; } }