package org.pac4j.vertx.handler.impl;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import org.pac4j.core.config.Config;
import org.pac4j.core.context.session.SessionStore;
import org.pac4j.core.util.CommonHelper;
import org.pac4j.vertx.VertxWebContext;
import org.pac4j.vertx.auth.Pac4jAuthProvider;
import java.net.URI;
import java.net.URISyntaxException;
/**
* Version of the Pac4j authentication handler which auto-deploys a CallbackHandler on the relative URL derived from
* the path of the callback URL specified in the Clients object held within the Config object supplied in the
* constructor.
*
* There is no requirement to use this handler rather than a SecurityHandler (and indeed where the same
* callback URL is being potentially used for multiple authentication handlers it may muddy the waters) but it is supplied
* as a convenience to anyone wanting to perform very simple indirect authentications.
*
* If there is a desire to use the same callback for multiple indirect authentications, it is recommended to explicitly
* deploy a CallbackHandler for clarity.
*
* @author Jeremy Prime
* @since 2.0.0
*/
public class CallbackDeployingPac4jAuthHandler extends SecurityHandler {
private static final Logger LOG = LoggerFactory.getLogger(CallbackDeployingPac4jAuthHandler.class);
// Consider coalescing the manager options into the handler options and then generating the manageroptions from them
public CallbackDeployingPac4jAuthHandler(final Vertx vertx,
final SessionStore<VertxWebContext> sessionStore,
final Config config,
final Router router,
final Pac4jAuthProvider authProvider,
final SecurityHandlerOptions options,
final CallbackHandlerOptions callbackOptions) {
super(vertx, sessionStore, config, authProvider, options);
// Other null checks performed by parent class
CommonHelper.assertNotNull("router", router);
CommonHelper.assertNotBlank("callbackUrl", config.getClients().getCallbackUrl());
final URI uri;
try {
uri = new URI(config.getClients().getCallbackUrl());
} catch (URISyntaxException e) {
LOG.error(e.getMessage());
throw toTechnicalException(e);
}
// Start manager verticle
router.route(HttpMethod.GET, uri.getPath()).handler(authResultHandler(vertx, sessionStore, config, callbackOptions));
}
private Handler<RoutingContext> authResultHandler(final Vertx vertx,
final SessionStore<VertxWebContext> sessionStore,
final Config config,
final CallbackHandlerOptions callbackOptions) {
return new CallbackHandler(vertx, sessionStore, config, callbackOptions);
}
}