diff --git a/docker-compose-env/vtp.env b/docker-compose-env/vtp.env index fc975db7..e9492460 100644 --- a/docker-compose-env/vtp.env +++ b/docker-compose-env/vtp.env @@ -29,7 +29,7 @@ KAFKA_CREDSTORE_PASSWORD=changeit KAFKA_OVERRIDE_KEYSTORE_PASSWORD=devillokeystore1234 NO_NAV_GATEWAYS_K9_SAK=http://k9-sak:8080/k9/sak -K9_SAK_AZURE_AUDIENCE=api://vtp/.default +K9_SAK_TOKENX_AUDIENCE=dev-fss:k9saksbehandling:k9-sak SWAGGER_ENABLED=true LOGGING_LEVEL_NO_NAV_SECURITY=DEBUG \ No newline at end of file diff --git a/nais/dev-gcp.json b/nais/dev-gcp.json index 2d9e9315..7a151ae7 100644 --- a/nais/dev-gcp.json +++ b/nais/dev-gcp.json @@ -63,7 +63,7 @@ "K9_SELVBETJENING_OPPSLAG_AZURE_AUDIENCE": "api://dev-gcp.dusseldorf.k9-selvbetjening-oppslag/.default", "NO_NAV_GATEWAYS_K9_SAK": "https://k9-sak.dev-fss-pub.nais.io/k9/sak", - "K9_SAK_AZURE_AUDIENCE": "api://dev-fss.k9saksbehandling.k9-sak/.default", + "K9_SAK_TOKENX_AUDIENCE": "dev-fss:k9saksbehandling:k9-sak", "NO_NAV_GATEWAYS_SAF_SELVBETJENING_BASE_URL": "https://safselvbetjening-q1.dev-fss-pub.nais.io", "SAFSELVBETJENING_TOKEN_X_AUDIENCE": "dev-fss:teamdokumenthandtering:safselvbetjening-q1", diff --git a/nais/prod-gcp.json b/nais/prod-gcp.json index 2f1d38a0..e5f8e966 100644 --- a/nais/prod-gcp.json +++ b/nais/prod-gcp.json @@ -59,7 +59,7 @@ "SAFSELVBETJENING_TOKEN_X_AUDIENCE": "prod-fss:teamdokumenthandtering:safselvbetjening", "NO_NAV_GATEWAYS_K9_SAK": "https://k9-sak.prod-fss-pub.nais.io/k9/sak", - "K9_SAK_AZURE_AUDIENCE": "api://prod-fss.k9saksbehandling.k9-sak/.default", + "K9_SAK_TOKENX_AUDIENCE": "prod-fss:k9saksbehandling:k9-sak", "NO_NAV_GATEWAYS_SIF_INNSYN_API_BASE_URL": "http://sif-innsyn-api", "SIF_INNSYN_API_TOKEN_X_AUDIENCE": "prod-gcp:dusseldorf:sif-innsyn-api", diff --git a/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakController.kt b/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakController.kt index 792567db..befccf54 100644 --- a/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakController.kt +++ b/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakController.kt @@ -6,7 +6,6 @@ import no.nav.sifinnsynapi.Routes import no.nav.sifinnsynapi.common.AktørId import no.nav.sifinnsynapi.common.IkkeAktivertIProduksjon import no.nav.sifinnsynapi.config.Issuers -import no.nav.sifinnsynapi.oppslag.OppslagsService import org.springframework.http.HttpStatus import org.springframework.http.MediaType import org.springframework.web.bind.annotation.PostMapping @@ -22,15 +21,11 @@ import org.springframework.web.bind.annotation.RestController ) class K9SakController( private val k9SakService: K9SakService, - private val oppslagsService: OppslagsService ) { @PostMapping(Routes.K9SAK_OMSORGSDAGER_KRONISK_SYKT_BARN_GYLDIG_VEDTAK, produces = [MediaType.APPLICATION_JSON_VALUE]) @ResponseStatus(HttpStatus.OK) fun hentSisteGyldigeVedtakForAktorId(@RequestBody requestDto: OmsorgsdagerKronsinskSuktBarnRequestDto ): HentSisteGyldigeVedtakForAktorIdResponse? { - val aktørId = oppslagsService.hentSøker()?.aktørId?: throw IllegalStateException("Fant ikke aktørId for innlogget bruker") - return k9SakService.hentSisteGyldigeVedtakForAktorId(HentSisteGyldigeVedtakForAktorIdDto( - aktørId = AktørId(aktørId), pleietrengendeAktørId = requestDto.pleietrengendeAktørId )) } diff --git a/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakKlientKonfig.kt b/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakKlientKonfig.kt index ff297a71..cd9edf45 100644 --- a/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakKlientKonfig.kt +++ b/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakKlientKonfig.kt @@ -27,12 +27,12 @@ class K9SakKlientKonfig( private companion object { val logger: Logger = LoggerFactory.getLogger(K9SakKlientKonfig::class.java) - const val AZURE_K9_SAK = "azure-k9-sak" + const val TOKENX_K9_SAK = "tokenx-k9-sak" } - private val azureK9SakClientProperties = - oauth2Config.registration[AZURE_K9_SAK] - ?: throw RuntimeException("could not find oauth2 client config for $AZURE_K9_SAK") + private val tokenXK9SakClientProperties = + oauth2Config.registration[TOKENX_K9_SAK] + ?: throw RuntimeException("could not find oauth2 client config for $TOKENX_K9_SAK") @Bean(name = ["k9SakKlient"]) fun restTemplate( @@ -54,9 +54,8 @@ class K9SakKlientKonfig( when { request.uri.path == "/isalive" -> {} // ignorer - else -> { - oAuth2AccessTokenService.getAccessToken(azureK9SakClientProperties).accessToken?.let { + oAuth2AccessTokenService.getAccessToken(tokenXK9SakClientProperties).accessToken?.let { request.headers.setBearerAuth(it) }?: throw SecurityException("Access token er null") } diff --git a/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakService.kt b/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakService.kt index 636bd4fd..372d86e6 100644 --- a/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakService.kt +++ b/src/main/kotlin/no/nav/sifinnsynapi/k9sak/K9SakService.kt @@ -6,8 +6,6 @@ import no.nav.sifinnsynapi.common.AktørId import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.boot.actuate.health.Health -import org.springframework.boot.actuate.health.ReactiveHealthIndicator import org.springframework.http.HttpEntity import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus @@ -21,7 +19,6 @@ import org.springframework.web.client.HttpClientErrorException import org.springframework.web.client.HttpServerErrorException import org.springframework.web.client.ResourceAccessException import org.springframework.web.client.RestTemplate -import reactor.core.publisher.Mono import java.net.URI import java.time.LocalDate @@ -91,7 +88,6 @@ class K9SakService( } data class HentSisteGyldigeVedtakForAktorIdDto( - val aktørId: AktørId, val pleietrengendeAktørId: AktørId ) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c6d6bb56..cd6f201d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -57,14 +57,15 @@ no.nav: token-exchange: audience: ${SIF_INNSYN_API_TOKEN_X_AUDIENCE} - azure-k9-sak: - token-endpoint-url: ${AZURE_OPENID_CONFIG_TOKEN_ENDPOINT} - grant-type: client_credentials - scope: ${K9_SAK_AZURE_AUDIENCE} + tokenx-k9-sak: + token-endpoint-url: ${TOKEN_X_TOKEN_ENDPOINT} + grant-type: urn:ietf:params:oauth:grant-type:token-exchange authentication: client-auth-method: private_key_jwt - client-id: ${AZURE_APP_CLIENT_ID} - client-jwk: ${AZURE_APP_JWK} + client-id: ${TOKEN_X_CLIENT_ID} + client-jwk: ${TOKEN_X_PRIVATE_JWK} + token-exchange: + audience: ${K9_SAK_TOKENX_AUDIENCE} topic: # Bryter betegner av/på funksjon for kafkalytter. True (på), False (av). diff --git a/src/test/kotlin/no/nav/sifinnsynapi/k9sak/K9SakControllerTest.kt b/src/test/kotlin/no/nav/sifinnsynapi/k9sak/K9SakControllerTest.kt index 57fdd105..fc178998 100644 --- a/src/test/kotlin/no/nav/sifinnsynapi/k9sak/K9SakControllerTest.kt +++ b/src/test/kotlin/no/nav/sifinnsynapi/k9sak/K9SakControllerTest.kt @@ -6,8 +6,6 @@ import no.nav.k9.sak.typer.Saksnummer import no.nav.security.mock.oauth2.MockOAuth2Server import no.nav.security.token.support.spring.test.EnableMockOAuth2Server import no.nav.sifinnsynapi.config.SecurityConfiguration -import no.nav.sifinnsynapi.oppslag.OppslagsService -import no.nav.sifinnsynapi.oppslag.SøkerOppslagRespons import no.nav.sifinnsynapi.util.CallIdGenerator import no.nav.sifinnsynapi.utils.hentToken import org.junit.jupiter.api.Test @@ -40,9 +38,6 @@ class K9SakControllerTest { @MockkBean lateinit var k9SakService: K9SakService - @MockkBean - lateinit var oppslagsService: OppslagsService - @Test fun `fungerer fint`() { every { k9SakService.hentSisteGyldigeVedtakForAktorId(any()) } returns HentSisteGyldigeVedtakForAktorIdResponse( @@ -50,7 +45,6 @@ class K9SakControllerTest { saksnummer = Saksnummer("123456"), vedtaksdato = LocalDate.now() ) - every { oppslagsService.hentSøker() } returns SøkerOppslagRespons(aktørId = "123456") mockMvc.post("/k9sak/omsorgsdager-kronisk-sykt-barn/har-gyldig-vedtak") { contentType = MediaType.APPLICATION_JSON @@ -89,42 +83,10 @@ class K9SakControllerTest { }.andExpect { status { isUnauthorized() } } } - @Test - fun `forventer å feile dersom aktørId mangler`() { - every { oppslagsService.hentSøker() } throws IllegalStateException("Fant ikke aktørId for innlogget bruker") - - mockMvc.post("/k9sak/omsorgsdager-kronisk-sykt-barn/har-gyldig-vedtak") { - contentType = MediaType.APPLICATION_JSON - headers { setBearerAuth(mockOAuth2Server.hentToken("123456789").serialize()) } - content = """ - { - "pleietrengendeAktørId": "123456" - } - """.trimIndent() - }.andExpect { - status { isInternalServerError() } - content { - json( - """ - { - "type": "/problem-details/internal-server-error", - "title": "Et uventet feil har oppstått", - "status": 500, - "detail": "Fant ikke aktørId for innlogget bruker", - "instance": "http://localhost/k9sak/omsorgsdager-kronisk-sykt-barn/har-gyldig-vedtak" - } - """.trimIndent() - ) - } - } - } - @Test fun `forventer feil når kall mot k9 feiler`() { every { k9SakService.hentSisteGyldigeVedtakForAktorId(any()) } throws K9SakException("Ugyldig pleietrengendeAktørId", HttpStatus.BAD_REQUEST) - every { oppslagsService.hentSøker() } returns SøkerOppslagRespons(aktørId = "123456") - mockMvc.post("/k9sak/omsorgsdager-kronisk-sykt-barn/har-gyldig-vedtak") { contentType = MediaType.APPLICATION_JSON headers { setBearerAuth(mockOAuth2Server.hentToken("123456789").serialize()) } diff --git a/src/test/kotlin/no/nav/sifinnsynapi/k9sak/K9SakServiceTest.kt b/src/test/kotlin/no/nav/sifinnsynapi/k9sak/K9SakServiceTest.kt index 1f540d86..9cd85f57 100644 --- a/src/test/kotlin/no/nav/sifinnsynapi/k9sak/K9SakServiceTest.kt +++ b/src/test/kotlin/no/nav/sifinnsynapi/k9sak/K9SakServiceTest.kt @@ -3,9 +3,16 @@ package no.nav.sifinnsynapi.k9sak import com.github.tomakehurst.wiremock.client.WireMock import com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor import com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo +import com.ninjasquad.springmockk.MockkBean +import io.mockk.every import no.nav.k9.sak.typer.Saksnummer +import no.nav.security.mock.oauth2.MockOAuth2Server +import no.nav.security.token.support.client.core.oauth2.OAuth2AccessTokenResponse +import no.nav.security.token.support.client.core.oauth2.OAuth2AccessTokenService import no.nav.security.token.support.spring.test.EnableMockOAuth2Server import no.nav.sifinnsynapi.common.AktørId +import no.nav.sifinnsynapi.utils.hentToken +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import org.springframework.beans.factory.annotation.Autowired @@ -27,18 +34,30 @@ internal class K9SakServiceTest { @Autowired lateinit var k9SakService: K9SakService + @Autowired + lateinit var mockOAuth2Server: MockOAuth2Server + + @MockkBean + lateinit var oAuth2AccessTokenService: OAuth2AccessTokenService + + private companion object { private val omsorgsdagerKroniskSyktBarnHarGyldigVedtakUrl = "/k9-sak-mock/k9/sak/api/brukerdialog/omsorgsdager-kronisk-sykt-barn/har-gyldig-vedtak" } + @BeforeEach + fun setUp() { + var token = mockOAuth2Server.hentToken("123456789", audience = "dev-fss:k9saksbehandling:k9-sak").serialize() + every { oAuth2AccessTokenService.getAccessToken(any()) } returns OAuth2AccessTokenResponse(token) + } + @Test fun `k9-sak svarer som forventet`() { - val aktør = AktørId("1234") val pleietrengendeAktør = AktørId("2345") stubK9Sak( - aktør, pleietrengendeAktør, 200, + pleietrengendeAktør, 200, // language=JSON """ { @@ -51,7 +70,6 @@ internal class K9SakServiceTest { k9SakService.hentSisteGyldigeVedtakForAktorId( HentSisteGyldigeVedtakForAktorIdDto( - aktør, pleietrengendeAktør ) ) @@ -59,11 +77,10 @@ internal class K9SakServiceTest { @Test fun `k9-sak svarer med ingen behandling funnet`() { - val aktør = AktørId("1234") val pleietrengendeAktør = AktørId("2345") stubK9Sak( - aktør, pleietrengendeAktør, 200, + pleietrengendeAktør, 200, // language=JSON """ { @@ -76,7 +93,6 @@ internal class K9SakServiceTest { k9SakService.hentSisteGyldigeVedtakForAktorId( HentSisteGyldigeVedtakForAktorIdDto( - aktør, pleietrengendeAktør ) ) @@ -84,11 +100,10 @@ internal class K9SakServiceTest { @Test fun `server exceptions blir håndtert`() { - val aktør = AktørId("1234") val pleietrengendeAktør = AktørId("2345") stubK9Sak( - aktør, pleietrengendeAktør, 500, + pleietrengendeAktør, 500, // language=JSON """ { @@ -102,7 +117,6 @@ internal class K9SakServiceTest { assertThrows { k9SakService.hentSisteGyldigeVedtakForAktorId( HentSisteGyldigeVedtakForAktorIdDto( - aktør, pleietrengendeAktør ) ) @@ -116,11 +130,10 @@ internal class K9SakServiceTest { @Test fun `klient exceptions blir håndtert`() { - val aktør = AktørId("1234") val pleietrengendeAktør = AktørId("2345") stubK9Sak( - aktør, pleietrengendeAktør, 401, + pleietrengendeAktør, 401, // language=JSON """ { @@ -134,7 +147,6 @@ internal class K9SakServiceTest { assertThrows { k9SakService.hentSisteGyldigeVedtakForAktorId( HentSisteGyldigeVedtakForAktorIdDto( - aktør, pleietrengendeAktør ) ) @@ -147,7 +159,7 @@ internal class K9SakServiceTest { } - private fun stubK9Sak(aktørId: AktørId, pleietrengendeAktørId: AktørId, status: Int, responseBody: String) { + private fun stubK9Sak(pleietrengendeAktørId: AktørId, status: Int, responseBody: String) { WireMock.stubFor( WireMock.post(WireMock.urlPathMatching(omsorgsdagerKroniskSyktBarnHarGyldigVedtakUrl)) .withHeader("Authorization", WireMock.matching(".*")) @@ -156,7 +168,6 @@ internal class K9SakServiceTest { //language=json """ { - "aktørId": "${aktørId.aktørId}", "pleietrengendeAktørId": "${pleietrengendeAktørId.aktørId}" } """.trimIndent() diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index b4b79a91..192f22f7 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -34,21 +34,12 @@ no.nav: client-id: dev-gcp:dusseldorf:k9-sak-innsyn-api client-jwk: src/test/resources/private_jwk.json - azure-k9-sak: - token-endpoint-url: http://localhost:${mock-oauth2-server.port}/oauth2/v2.0/token - grant-type: client_credentials - scope: api://dev-fss:k9saksbehandling:k9-sak - authentication: - client-auth-method: private_key_jwt - client-id: dev-gcp:dusseldorf:k9-sak-innsyn-api - client-jwk: src/test/resources/private_jwk.json - tokenx-safselvbetjening: token-endpoint-url: http://localhost:${mock-oauth2-server.port}/default/token grant-type: urn:ietf:params:oauth:grant-type:token-exchange authentication: client-auth-method: private_key_jwt - client-id: "dev-gcp:dusseldorf:sif-innsyn-api" + client-id: "dev-gcp:dusseldorf:k9-sak-innsyn-api" client-jwk: src/test/resources/tokenx-jwk.json token-exchange: audience: dev-fss:teamdokumenthandtering:safselvbetjening @@ -62,6 +53,17 @@ no.nav: client-jwk: src/test/resources/tokenx-jwk.json token-exchange: audience: dev-gcp:dusseldorf:sif-innsyn-api + + tokenx-k9-sak: + token-endpoint-url: http://localhost:${mock-oauth2-server.port}/default/token + grant-type: urn:ietf:params:oauth:grant-type:token-exchange + authentication: + client-auth-method: private_key_jwt + client-id: "dev-gcp:dusseldorf:k9-sak-innsyn-api" + client-jwk: src/test/resources/tokenx-jwk.json + token-exchange: + audience: dev-fss:k9saksbehandling:k9-sak + metrics: interval: 36000