package jwt4j; import com.google.gson.Gson; import jwt4j.checkers.AudienceChecker; import jwt4j.checkers.ExpirationChecker; import jwt4j.checkers.ExpirationIssuedAtChecker; import jwt4j.checkers.IdChecker; import jwt4j.checkers.IssuerChecker; import jwt4j.checkers.NotBeforeChecker; import jwt4j.checkers.SubjectChecker; import java.util.LinkedList; import java.util.List; import java.util.Optional; public class JWTHandlerBuilder<T> { private final Gson gson = new Gson(); private Optional<Class<T>> dataClass = Optional.empty(); private Optional<Algorithm> algorithm = Optional.of(Algorithm.HS256); private Optional<byte[]> secret = Optional.empty(); private Optional<RegisteredClaimsValidator> registeredClaimsValidator = Optional.of(RegisteredClaimsValidator.DEFAULT); private Optional<String> issuer = Optional.empty(); private Optional<String> subject = Optional.empty(); private Optional<String> audience = Optional.empty(); private int expirationSeconds = -1; private int notBeforeSeconds = -1; private int leewaySeconds = 0; private boolean issuedAtEnabled = false; private Optional<JWTIdGenerator> jwtIdGenerator = Optional.empty(); public JWTHandlerBuilder<T> withDataClass(Class<T> dataClass) { this.dataClass = Optional.ofNullable(dataClass); return this; } public JWTHandlerBuilder<T> withAlgorithm(Algorithm algorithm) { this.algorithm = Optional.ofNullable(algorithm); if (algorithm == Algorithm.none) { secret = Optional.of("".getBytes()); } return this; } public JWTHandlerBuilder<T> withSecret(byte[] secret) { this.secret = Optional.ofNullable(secret); return this; } public JWTHandlerBuilder<T> withRegisteredClaimsValidator(RegisteredClaimsValidator registeredClaimsValidator) { this.registeredClaimsValidator = Optional.ofNullable(registeredClaimsValidator); return this; } public JWTHandlerBuilder<T> withIssuer(String issuer) { this.issuer = Optional.ofNullable(issuer); return this; } public JWTHandlerBuilder<T> withSubject(String subject) { this.subject = Optional.ofNullable(subject); return this; } public JWTHandlerBuilder<T> withAudience(String audience) { this.audience = Optional.ofNullable(audience); return this; } public JWTHandlerBuilder<T> withExpirationSeconds(int expirationSeconds) { this.expirationSeconds = expirationSeconds; return this; } public JWTHandlerBuilder<T> withNotBeforeSeconds(int notBeforeSeconds) { this.notBeforeSeconds = notBeforeSeconds; return this; } public JWTHandlerBuilder<T> withLeewaySeconds(int leewaySeconds) { this.leewaySeconds = leewaySeconds; return this; } public JWTHandlerBuilder<T> withIssuedAtEnabled(boolean issuedAtEnabled) { this.issuedAtEnabled = issuedAtEnabled; return this; } public JWTHandlerBuilder<T> withJwtIdGenerator(JWTIdGenerator jwtIdGenerator) { this.jwtIdGenerator = Optional.ofNullable(jwtIdGenerator); return this; } public JWTHandler<T> build() { return new JWTHandler<>( buildEncoder(), buildDecoder(), dataClass.orElseThrow(IllegalArgumentException::new), gson, issuer, subject, audience, expirationSeconds, notBeforeSeconds, issuedAtEnabled, jwtIdGenerator); } public JWTDecoder buildDecoder() { return new JWTDecoder( algorithm.orElseThrow(IllegalArgumentException::new), secret.orElseThrow(IllegalArgumentException::new), gson, buildTokenCheckers()); } private List<TokenChecker> buildTokenCheckers() { final LinkedList<TokenChecker> tokenCheckers = new LinkedList<>(); if (expirationSeconds > 0) { if (issuedAtEnabled) { tokenCheckers.add(new ExpirationIssuedAtChecker(expirationSeconds, leewaySeconds)); } else { tokenCheckers.add(new ExpirationChecker(leewaySeconds)); } } if (notBeforeSeconds > 0) { tokenCheckers.add(new NotBeforeChecker(leewaySeconds)); } if (issuer.isPresent()) { tokenCheckers.add(new IssuerChecker(issuer.get())); } if (audience.isPresent()) { tokenCheckers.add(new AudienceChecker(audience.get())); } if (subject.isPresent()) { tokenCheckers.add(new SubjectChecker(subject.get())); } if (jwtIdGenerator.isPresent()) { tokenCheckers.add(new IdChecker()); } return tokenCheckers; } public JWTEncoder buildEncoder() { return new JWTEncoder( algorithm.orElseThrow(IllegalArgumentException::new), secret.orElseThrow(IllegalArgumentException::new), registeredClaimsValidator.orElseThrow(IllegalArgumentException::new)); } }