All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.quarkus.amazon.lambda.http.DefaultLambdaIdentityProvider Maven / Gradle / Ivy

package io.quarkus.amazon.lambda.http;

import java.security.Principal;
import java.util.Map;
import java.util.Optional;

import javax.enterprise.context.ApplicationScoped;

import io.quarkus.amazon.lambda.http.model.AwsProxyRequest;
import io.quarkus.amazon.lambda.http.model.AwsProxyRequestContext;
import io.quarkus.security.identity.AuthenticationRequestContext;
import io.quarkus.security.identity.IdentityProvider;
import io.quarkus.security.identity.SecurityIdentity;
import io.quarkus.security.runtime.QuarkusPrincipal;
import io.quarkus.security.runtime.QuarkusSecurityIdentity;
import io.smallrye.mutiny.Uni;

@ApplicationScoped
final public class DefaultLambdaIdentityProvider implements IdentityProvider {

    @Override
    public Class getRequestType() {
        return DefaultLambdaAuthenticationRequest.class;
    }

    @Override
    public Uni authenticate(DefaultLambdaAuthenticationRequest request,
            AuthenticationRequestContext context) {
        AwsProxyRequest event = request.getEvent();
        SecurityIdentity identity = authenticate(event);
        if (identity == null) {
            return Uni.createFrom().optional(Optional.empty());
        }
        return Uni.createFrom().item(identity);
    }

    /**
     * Create a SecurityIdentity with a principal derived from APIGatewayV2HTTPEvent.
     * Looks for Cognito JWT, IAM, or Custom Lambda metadata for principal name
     *
     * @param event
     * @return
     */
    public static SecurityIdentity authenticate(AwsProxyRequest event) {
        Principal principal = getPrincipal(event);
        if (principal == null) {
            return null;
        }
        QuarkusSecurityIdentity.Builder builder = QuarkusSecurityIdentity.builder();
        builder.setPrincipal(principal);
        return builder.build();
    }

    public static Principal getPrincipal(AwsProxyRequest request) {
        final Map systemEnvironment = System.getenv();
        final boolean isSamLocal = Boolean.parseBoolean(systemEnvironment.get("AWS_SAM_LOCAL"));
        final AwsProxyRequestContext requestContext = request.getRequestContext();
        if (isSamLocal && (requestContext == null
                || (requestContext.getAuthorizer() == null && requestContext.getIdentity() == null))) {
            final String forcedUserName = systemEnvironment.get("QUARKUS_AWS_LAMBDA_FORCE_USER_NAME");
            if (forcedUserName != null && !forcedUserName.isEmpty()) {
                return new QuarkusPrincipal(forcedUserName);
            }
        } else {
            if (requestContext != null) {
                if (requestContext.getIdentity() != null && requestContext.getIdentity().getUser() != null) {
                    return new IAMPrincipal(requestContext.getIdentity());
                } else if (requestContext.getAuthorizer() != null) {
                    if (requestContext.getAuthorizer().getClaims() != null) {
                        return new CognitoPrincipal(requestContext.getAuthorizer().getClaims());
                    } else if (requestContext.getAuthorizer().getPrincipalId() != null) {
                        return new CustomPrincipal(requestContext.getAuthorizer().getPrincipalId(),
                                requestContext.getAuthorizer().getContextProperties());
                    }
                }
            }
        }
        return null;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy