From 12bd36346cf12bf7b8d17a391acf6f88db24d08a Mon Sep 17 00:00:00 2001 From: "Kristen.Herum" Date: Fri, 20 Dec 2024 11:00:18 +0100 Subject: [PATCH] ``` Refactor to use Altinn3 API for user access management #deploy-bruker-service Replaced Person-Organisasjon-Tilgang API with Altinn3 API across the application. Deprecated `OrganisasjonDTO` and updated classes to utilize `AltinnBrukerRequest` and Altinn3 DTOs. Adjusted configuration and consumer logic to align with the new API structure for improved functionality. ``` --- .../apps/brukerservice/config/Consumers.java | 10 +---- .../PersonOrganisasjonTilgangConsumer.java | 39 ++++++++----------- ...mand.java => GetBrukertilgangCommand.java} | 22 ++++++----- .../consumer/dto/AltinnBrukerRequest.java | 11 ++++++ .../consumer/dto/OrganisasjonDTO.java | 4 -- .../brukerservice/domain/Organisasjon.java | 34 +++++++--------- .../src/main/resources/application-dev.yml | 6 +-- .../src/main/resources/application-local.yml | 8 ++-- .../src/main/resources/application.yml | 6 +-- 9 files changed, 67 insertions(+), 73 deletions(-) rename apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/{GetOrganisasjonCommand.java => GetBrukertilgangCommand.java} (53%) create mode 100644 apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/AltinnBrukerRequest.java delete mode 100644 apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/OrganisasjonDTO.java diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/Consumers.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/Consumers.java index 51662bd8e36..e3473bbb710 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/Consumers.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/config/Consumers.java @@ -9,14 +9,6 @@ import static lombok.AccessLevel.PACKAGE; -/** - * Samler alle placeholders for ulike {@code consumers.*}-konfigurasjon her, dvs. subklasser av {@code ServerProperties}. - *

- * Husk at Spring Boot bruker relaxed binding - * mellom configuration properties og field names. - * - * @see ServerProperties - */ @Configuration @ConfigurationProperties(prefix = "consumers") @NoArgsConstructor(access = PACKAGE) @@ -24,6 +16,6 @@ @Setter(PACKAGE) public class Consumers { - private ServerProperties testnavPersonOrganisasjonTilgangService; + private ServerProperties testnavAltinn3TilgangService; } diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java index 0a947be0817..b29097a6057 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/PersonOrganisasjonTilgangConsumer.java @@ -1,51 +1,44 @@ package no.nav.testnav.apps.brukerservice.consumer; -import com.fasterxml.jackson.databind.ObjectMapper; import no.nav.testnav.apps.brukerservice.config.Consumers; -import no.nav.testnav.apps.brukerservice.consumer.command.GetOrganisasjonCommand; +import no.nav.testnav.apps.brukerservice.consumer.command.GetBrukertilgangCommand; import no.nav.testnav.apps.brukerservice.domain.Organisasjon; +import no.nav.testnav.libs.reactivesecurity.action.GetAuthenticatedUserId; import no.nav.testnav.libs.reactivesecurity.exchange.TokenExchange; import no.nav.testnav.libs.securitycore.domain.ServerProperties; -import org.springframework.http.MediaType; -import org.springframework.http.codec.json.Jackson2JsonDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @Component public class PersonOrganisasjonTilgangConsumer { + private final WebClient webClient; private final ServerProperties serverProperties; private final TokenExchange tokenExchange; + private final GetAuthenticatedUserId getAuthenticatedUserId; public PersonOrganisasjonTilgangConsumer( Consumers consumers, TokenExchange tokenExchange, - ObjectMapper objectMapper, - WebClient.Builder webClientBuilder) { - serverProperties = consumers.getTestnavPersonOrganisasjonTilgangService(); + WebClient.Builder webClientBuilder, + GetAuthenticatedUserId getAuthenticatedUserId) { + + serverProperties = consumers.getTestnavAltinn3TilgangService(); this.tokenExchange = tokenExchange; - ExchangeStrategies jacksonStrategy = ExchangeStrategies - .builder() - .codecs( - config -> { - config.defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); - config.defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); - }) - .build(); this.webClient = webClientBuilder - .exchangeStrategies(jacksonStrategy) .baseUrl(serverProperties.getUrl()) .build(); + this.getAuthenticatedUserId = getAuthenticatedUserId; } public Mono getOrganisasjon(String orgnummer) { - return tokenExchange.exchange(serverProperties) - .flatMap(accessToken -> new GetOrganisasjonCommand(webClient, orgnummer, accessToken.getTokenValue()).call()) - .map(Organisasjon::new); + + return Mono.from(getAuthenticatedUserId.call() + .flatMapMany(userId -> tokenExchange.exchange(serverProperties) + .flatMapMany(accessToken -> + new GetBrukertilgangCommand(webClient, userId, accessToken.getTokenValue()).call())) + .filter(org -> org.getOrganisasjonsnummer().equals(orgnummer)) + .map(Organisasjon::new)); } } diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetOrganisasjonCommand.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetBrukertilgangCommand.java similarity index 53% rename from apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetOrganisasjonCommand.java rename to apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetBrukertilgangCommand.java index 2a766f152c8..f3e949dd4e4 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetOrganisasjonCommand.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/command/GetBrukertilgangCommand.java @@ -1,31 +1,35 @@ package no.nav.testnav.apps.brukerservice.consumer.command; import lombok.RequiredArgsConstructor; -import no.nav.testnav.apps.brukerservice.consumer.dto.OrganisasjonDTO; +import no.nav.testnav.apps.brukerservice.consumer.dto.AltinnBrukerRequest; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; +import no.nav.testnav.libs.reactivecore.utils.WebClientFilter; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientResponseException; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.concurrent.Callable; @RequiredArgsConstructor -public class GetOrganisasjonCommand implements Callable> { +public class GetBrukertilgangCommand implements Callable> { private final WebClient webClient; - private final String organisasjonsnummer; + private final String ident; private final String token; @Override - public Mono call() { - return webClient.get() - .uri(builder -> builder.path("/api/v1/person/organisasjoner/{organisasjonsnummer}").build(organisasjonsnummer)) + public Flux call() { + return webClient.post() + .uri(builder -> builder.path("/api/v1/brukertilgang").build()) .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) + .bodyValue(new AltinnBrukerRequest(ident)) .retrieve() - .bodyToMono(OrganisasjonDTO.class) + .bodyToFlux(OrganisasjonDTO.class) + .doOnError(WebClientFilter::logErrorMessage) .onErrorResume( throwable -> throwable instanceof WebClientResponseException.NotFound, throwable -> Mono.empty() ); } -} - +} \ No newline at end of file diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/AltinnBrukerRequest.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/AltinnBrukerRequest.java new file mode 100644 index 00000000000..f70ff4216c1 --- /dev/null +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/AltinnBrukerRequest.java @@ -0,0 +1,11 @@ +package no.nav.testnav.apps.brukerservice.consumer.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class AltinnBrukerRequest { + + private String ident; +} diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/OrganisasjonDTO.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/OrganisasjonDTO.java deleted file mode 100644 index 425b1c3bf5c..00000000000 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/consumer/dto/OrganisasjonDTO.java +++ /dev/null @@ -1,4 +0,0 @@ -package no.nav.testnav.apps.brukerservice.consumer.dto; - -public record OrganisasjonDTO(String navn, String organisasjonsnummer, String organisasjonsfrom) { -} diff --git a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/domain/Organisasjon.java b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/domain/Organisasjon.java index 77904f9ed88..c292fbc5a20 100644 --- a/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/domain/Organisasjon.java +++ b/apps/bruker-service/src/main/java/no/nav/testnav/apps/brukerservice/domain/Organisasjon.java @@ -1,27 +1,23 @@ package no.nav.testnav.apps.brukerservice.domain; -import no.nav.testnav.apps.brukerservice.consumer.dto.OrganisasjonDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import no.nav.testnav.libs.dto.altinn3.v1.OrganisasjonDTO; -public class Organisasjon { - private final String navn; - private final String organisasjonsnummer; - private final String organisasjonsform; - - public Organisasjon(OrganisasjonDTO dto) { - this.navn = dto.navn(); - this.organisasjonsnummer = dto.organisasjonsnummer(); - this.organisasjonsform = dto.organisasjonsfrom(); - } +@Data +@NoArgsConstructor +@AllArgsConstructor - public String getNavn() { - return navn; - } +public class Organisasjon { - public String getOrganisasjonsnummer() { - return organisasjonsnummer; - } + private String navn; + private String organisasjonsnummer; + private String organisasjonsform; - public String getOrganisasjonsform() { - return organisasjonsform; + public Organisasjon(OrganisasjonDTO dto) { + this.navn = dto.getNavn(); + this.organisasjonsnummer = dto.getOrganisasjonsnummer(); + this.organisasjonsform = dto.getOrganisasjonsform(); } } diff --git a/apps/bruker-service/src/main/resources/application-dev.yml b/apps/bruker-service/src/main/resources/application-dev.yml index c1f2699a8f7..35c9fa83539 100644 --- a/apps/bruker-service/src/main/resources/application-dev.yml +++ b/apps/bruker-service/src/main/resources/application-dev.yml @@ -19,6 +19,6 @@ spring: consumers: - testnav-person-organisasjon-tilgang-service: - url: http://testnav-person-organisasjon-tilgang-service-dev.dolly.svc.cluster.local - name: testnav-person-organisasjon-tilgang-service-dev \ No newline at end of file + testnav-altinn3-tilgang-service: + url: http://testnav-altinn3-tilgang-service.dolly.svc.cluster.local + name: testnav-altinn3-tilgang-service \ No newline at end of file diff --git a/apps/bruker-service/src/main/resources/application-local.yml b/apps/bruker-service/src/main/resources/application-local.yml index c0ec2ea2152..9c14722dfc9 100644 --- a/apps/bruker-service/src/main/resources/application-local.yml +++ b/apps/bruker-service/src/main/resources/application-local.yml @@ -4,6 +4,8 @@ AZURE_APP_CLIENT_SECRET: ${sm://azure-app-client-secret} CRYPTOGRAPHY_SECRET: DUMMY SUPER SECRET CRYPTOGRAPHY KEY THAT IS NOT SECURE JWT_SECRET: DUMMY SUPER SECRET JWT KEY THAT IS NOT SECURE +TOKEN_X_CLIENT_ID: dev-gcp:dolly:testnav-bruker-service-dev + spring: application: name: testnav-bruker-service-dev @@ -15,6 +17,6 @@ spring: password: consumers: - testnav-person-organisasjon-tilgang-service: - url: https://testnav-person-organisasjon-tilgang-service-dev.intern.dev.nav.no - name: testnav-person-organisasjon-tilgang-service-dev + testnav-altinn3-tilgang-service: + url: https://testnav-altinn3-tilgang-service.intern.dev.nav.no + name: testnav-altinn3-tilgang-service diff --git a/apps/bruker-service/src/main/resources/application.yml b/apps/bruker-service/src/main/resources/application.yml index b5039ab17b4..21370345f9d 100644 --- a/apps/bruker-service/src/main/resources/application.yml +++ b/apps/bruker-service/src/main/resources/application.yml @@ -22,11 +22,11 @@ springdoc: url: /v3/api-docs consumers: - testnav-person-organisasjon-tilgang-service: - url: http://testnav-person-organisasjon-tilgang-service.dolly.svc.cluster.local + testnav-altinn3-tilgang-service: + url: http://testnav-altinn3-proxy.dolly.svc.cluster.local cluster: dev-gcp namespace: dolly - name: testnav-person-organisasjon-tilgang-service + name: testnav-altinn3-proxy management: endpoints: