diff --git a/src/dev/peerat/framework/Router.java b/src/dev/peerat/framework/Router.java index d993dd5..6e5c5fd 100644 --- a/src/dev/peerat/framework/Router.java +++ b/src/dev/peerat/framework/Router.java @@ -3,8 +3,10 @@ package dev.peerat.framework; import java.lang.reflect.Method; import java.net.ServerSocket; import java.net.Socket; +import java.security.Key; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.regex.Pattern; @@ -15,6 +17,7 @@ import javax.net.ssl.SSLServerSocketFactory; import org.jose4j.jwa.AlgorithmConstraints.ConstraintType; import org.jose4j.jwk.RsaJsonWebKey; import org.jose4j.jwk.RsaJwkGenerator; +import org.jose4j.jwk.JsonWebKey.OutputControlLevel; import org.jose4j.jws.AlgorithmIdentifiers; import org.jose4j.jws.JsonWebSignature; import org.jose4j.jwt.JwtClaims; @@ -41,32 +44,46 @@ public class Router{ private String[][] headers; private ServerSocket serverSocket; - public Router() throws Exception{ + public Router(){ this.logger = new Locker<>(); this.exceptions = new Locker<>(); int types = RequestType.values().length; this.mappers = new RouteMapper[types]; this.interceptors = new ArrayList<>(); for(RequestType type : RequestType.values()) this.mappers[type.ordinal()] = new RouteMapper<>(this); - this.rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048); this.headers = new String[types][0]; } - public Router configureJwt(Consumer consumer, Consumer claims, Function userCreator){ - JwtConsumerBuilder builder = new JwtConsumerBuilder() - .setRequireExpirationTime() - .setAllowedClockSkewInSeconds(30) - .setVerificationKey(rsaJsonWebKey.getKey()) - .setJwsAlgorithmConstraints(ConstraintType.PERMIT, AlgorithmIdentifiers.RSA_USING_SHA256); - - consumer.accept(builder); - - this.jwtConsumer = builder.build(); - this.claims = claims; - this.userCreator = userCreator; + public Router configureJwt(Consumer consumer, Consumer claims, Function userCreator) throws Exception{ + this.rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048); + configureJwtWithKey(consumer, claims, userCreator, this.rsaJsonWebKey.getKey()); return this; } + public Router configureJwt(Consumer consumer, Consumer claims, Function userCreator, Map keyParams) throws Exception{ + this.rsaJsonWebKey = new RsaJsonWebKey(keyParams); + configureJwtWithKey(consumer, claims, userCreator, this.rsaJsonWebKey.getKey()); + return this; + } + + private void configureJwtWithKey(Consumer consumer, Consumer claims, Function userCreator, Key key) throws Exception{ + JwtConsumerBuilder builder = new JwtConsumerBuilder() + .setRequireExpirationTime() + .setAllowedClockSkewInSeconds(30) + .setVerificationKey(key) + .setJwsAlgorithmConstraints(ConstraintType.PERMIT, AlgorithmIdentifiers.RSA_USING_SHA256); + + consumer.accept(builder); + + this.jwtConsumer = builder.build(); + this.claims = claims; + this.userCreator = userCreator; + } + + public Map exportJwtKey(){ + return this.rsaJsonWebKey.toParams(OutputControlLevel.INCLUDE_PRIVATE); + } + public Router addDefaultHeaders(RequestType type, String... headers){ String[] origin = this.headers[type.ordinal()]; String[] copy = new String[origin.length+headers.length];