package dev.dinauer.maven; import io.quarkus.oidc.AccessTokenCredential; import io.quarkus.security.credential.PasswordCredential; import io.quarkus.security.credential.TokenCredential; import io.quarkus.security.identity.IdentityProviderManager; import io.quarkus.security.identity.SecurityIdentity; import io.quarkus.security.identity.request.TokenAuthenticationRequest; import io.quarkus.security.identity.request.UsernamePasswordAuthenticationRequest; import io.quarkus.security.runtime.QuarkusSecurityIdentity; import io.quarkus.vertx.http.runtime.security.ChallengeData; import io.quarkus.vertx.http.runtime.security.HttpAuthenticationMechanism; import io.quarkus.vertx.http.runtime.security.HttpSecurityUtils; import io.smallrye.mutiny.Uni; import io.vertx.core.MultiMap; import io.vertx.core.http.Cookie; import io.vertx.ext.web.RoutingContext; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import net.bytebuddy.implementation.bind.MethodDelegationBinder; import org.apache.commons.lang3.Strings; import org.jboss.logging.Logger; import java.nio.charset.StandardCharsets; import java.util.Base64; @ApplicationScoped public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism { @Override public Uni authenticate(RoutingContext context, IdentityProviderManager identityProviderManager) { context.put(CustomAuthenticationMechanism.class.getName(), this); String authHeader = context.request().getHeader("Authorization"); if (authHeader != null && authHeader.startsWith("Basic ")) { String[] sections = new String(Base64.getDecoder().decode(Strings.CI.removeStart(authHeader, "Basic "))).split(":"); if (sections.length == 2) { UsernamePasswordAuthenticationRequest request = new UsernamePasswordAuthenticationRequest(sections[0], new PasswordCredential(sections[1].toCharArray())); HttpSecurityUtils.setRoutingContextAttribute(request, context); return identityProviderManager.authenticate(request); } } return Uni.createFrom().nullItem(); } @Override public Uni getChallenge(RoutingContext context) { return Uni.createFrom().item(new ChallengeData(401, "WWW-Authenticate", "Basic")); } }