package jwt4j;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
public class DefaultRegisteredClaimsValidator implements RegisteredClaimsValidator
{
private static final Map<String, Consumer<String>> CLAIMS_VALIDATOR = new HashMap<>();
private static final Consumer<String> STRING_OR_URI = value -> {
if (value == null) {
throw new IllegalArgumentException("Claim defined but no value specified.");
}
if (value.contains("://")) {
try {
URI.create(value);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Invalid URI format for claim value.");
}
}
};
private static final Consumer<String> NUMERIC_DATE = value -> {
try {
Long.valueOf(value);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Invalid numeric date format for claim value.");
}
};
private static final Consumer<String> UNRESTRICTED = value -> {
};
static {
CLAIMS_VALIDATOR.put(JWTConstants.ISSUER, STRING_OR_URI);
CLAIMS_VALIDATOR.put(JWTConstants.SUBJECT, STRING_OR_URI);
CLAIMS_VALIDATOR.put(JWTConstants.AUDIENCE, STRING_OR_URI);
CLAIMS_VALIDATOR.put(JWTConstants.EXPIRATION, NUMERIC_DATE);
CLAIMS_VALIDATOR.put(JWTConstants.NOT_BEFORE, NUMERIC_DATE);
CLAIMS_VALIDATOR.put(JWTConstants.ISSUED_AT, NUMERIC_DATE);
CLAIMS_VALIDATOR.put(JWTConstants.JWT_ID, UNRESTRICTED);
}
@Override
public void validate(final Map<String, String> claims)
{
if (claims != null) {
claims.forEach((claim, value) -> CLAIMS_VALIDATOR.getOrDefault(claim, UNRESTRICTED).accept(value));
}
}
}