package com.github.aesteve.vertx.nubes.reflections.factories; import com.github.aesteve.vertx.nubes.Config; import com.github.aesteve.vertx.nubes.annotations.auth.Auth; import com.github.aesteve.vertx.nubes.auth.AuthMethod; import com.github.aesteve.vertx.nubes.handlers.impl.CheckTokenHandler; import io.vertx.core.Handler; import io.vertx.ext.auth.AuthProvider; import io.vertx.ext.auth.jwt.JWTAuth; import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.handler.BasicAuthHandler; import io.vertx.ext.web.handler.JWTAuthHandler; import io.vertx.ext.web.handler.RedirectAuthHandler; import java.util.EnumMap; import java.util.Map; import java.util.function.Function; import static com.github.aesteve.vertx.nubes.auth.AuthMethod.*; public class AuthenticationFactory { private final Config config; private Map<AuthMethod, Function<AuthProvider, Handler<RoutingContext>>> authHandlers; public AuthenticationFactory(Config config) { this.config = config; authHandlers = new EnumMap<>(AuthMethod.class); authHandlers.put(BASIC, BasicAuthHandler::create); authHandlers.put(JWT, auth -> JWTAuthHandler.create((JWTAuth)config.getAuthProvider())); authHandlers.put(API_TOKEN, CheckTokenHandler::new); } public Handler<RoutingContext> create(Auth auth) { final AuthProvider authProvider = config.getAuthProvider(); if (authProvider == null) { return null; } final AuthMethod authMethod = auth.method(); Function<AuthProvider, Handler<RoutingContext>> authHandlerCreator = authHandlers.get(authMethod); if (authHandlerCreator == null && authMethod == REDIRECT) { final String redirect = auth.redirectURL(); if ("".equals(redirect)) { throw new IllegalArgumentException("You must specify a redirectURL if you're using Redirect Auth"); } return RedirectAuthHandler.create(authProvider, redirect); } else if (authHandlerCreator == null) { throw new UnsupportedOperationException(); } return authHandlerCreator.apply(authProvider); } }