AzureConfig.java

  1. package no.nav.data.common.security.azure;

  2. import com.microsoft.aad.msal4j.ClientCredentialFactory;
  3. import com.microsoft.aad.msal4j.ConfidentialClientApplication;
  4. import com.nimbusds.jose.jwk.source.RemoteJWKSet;
  5. import com.nimbusds.jose.util.DefaultResourceRetriever;
  6. import com.nimbusds.jose.util.ResourceRetriever;
  7. import com.nimbusds.oauth2.sdk.id.Issuer;
  8. import com.nimbusds.openid.connect.sdk.op.OIDCProviderConfigurationRequest;
  9. import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata;
  10. import lombok.SneakyThrows;
  11. import no.nav.data.common.exceptions.TechnicalException;
  12. import no.nav.data.common.security.AppIdMapping;
  13. import no.nav.data.common.security.RoleSupport;
  14. import no.nav.data.common.utils.MdcExecutor;
  15. import org.apache.commons.lang3.StringUtils;
  16. import org.springframework.context.annotation.Bean;
  17. import org.springframework.context.annotation.Configuration;

  18. import java.util.concurrent.ThreadPoolExecutor;

  19. @Configuration
  20. public class AzureConfig {

  21.     @Bean
  22.     public ResourceRetriever getJWTResourceRetriever() {
  23.         return new DefaultResourceRetriever(RemoteJWKSet.DEFAULT_HTTP_CONNECT_TIMEOUT * 2, RemoteJWKSet.DEFAULT_HTTP_READ_TIMEOUT * 2, RemoteJWKSet.DEFAULT_HTTP_SIZE_LIMIT);
  24.     }

  25.     @Bean
  26.     public AADStatelessAuthenticationFilter aadStatelessAuthenticationFilter(
  27.             ResourceRetriever resourceRetriever, AADAuthenticationProperties aadAuthProps, RoleSupport roleSupport,
  28.             AzureTokenProvider azureTokenProvider, AppIdMapping appIdMapping, OIDCProviderMetadata oidcProviderMetadata) {
  29.         return new AADStatelessAuthenticationFilter(azureTokenProvider, roleSupport, appIdMapping, aadAuthProps, resourceRetriever, oidcProviderMetadata);
  30.     }

  31.     @Bean
  32.     public OIDCProviderMetadata oidcProviderMetadata(AADAuthenticationProperties properties) {
  33.         try {
  34.             String issuerUrl = StringUtils.substringBefore(properties.getWellKnown(), OIDCProviderConfigurationRequest.OPENID_PROVIDER_WELL_KNOWN_PATH);
  35.             return OIDCProviderMetadata.resolve(new Issuer(issuerUrl), 5000, 5000);
  36.         } catch (Exception e) {
  37.             throw new TechnicalException("io error", e);
  38.         }
  39.     }

  40.     @Bean
  41.     @SneakyThrows
  42.     public ConfidentialClientApplication msalClient(AADAuthenticationProperties aadAuthProps, OIDCProviderMetadata oidcProviderMetadata) {
  43.         return ConfidentialClientApplication
  44.                 .builder(aadAuthProps.getClientId(), ClientCredentialFactory.createFromSecret(aadAuthProps.getClientSecret()))
  45.                 .authority(oidcProviderMetadata.getAuthorizationEndpointURI().toString())
  46.                 .executorService(msalThreadPool())
  47.                 .build();
  48.     }

  49.     @Bean
  50.     public ThreadPoolExecutor msalThreadPool() {
  51.         return MdcExecutor.newThreadPool(5, "msal");
  52.     }

  53.     @Bean
  54.     public AppIdMapping appIdMapping(AADAuthenticationProperties properties) {
  55.         return new AppIdMapping(properties.getAllowedAppIdMappings(), properties.getClientId());
  56.     }
  57. }