Skip to content

Commit d4edb86

Browse files
authored
Merge pull request #1901 from navikt/send-token-til-kodeverk
Send token til kodeverk
2 parents 9c88245 + 7f40579 commit d4edb86

File tree

11 files changed

+96
-42
lines changed

11 files changed

+96
-42
lines changed

.nais/dev.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ spec:
140140
value: "team-rocket.institusjon-opphold-hendelser-q2"
141141
- name: KODEVERK_URL
142142
value: "https://kodeverk-api.nav.no"
143+
- name: KODEVERK_CLIENT_ID
144+
value: "api://dev-gcp.team-rocket.kodeverk-api"
143145
- name: STS_URL
144146
value: "http://security-token-service.default.svc.nais.local"
145147
- name: GANDALF_URL

.nais/prod.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ spec:
140140
value: "team-rocket.institusjon-opphold-hendelser"
141141
- name: KODEVERK_URL
142142
value: "https://kodeverk-api.nav.no"
143+
- name: KODEVERK_CLIENT_ID
144+
value: "api://prod-gcp.team-rocket.kodeverk-api"
143145
- name: STS_URL
144146
value: "http://security-token-service.default.svc.nais.local"
145147
- name: GANDALF_URL

client/src/main/kotlin/no/nav/su/se/bakover/client/ProdClientsBuilder.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ data class ProdClientsBuilder(
5050
wellknownUrl = azureConfig.wellKnownUrl,
5151
)
5252
val kodeverk = KodeverkHttpClient(
53-
baseUrl = clientsConfig.kodeverkUrl,
53+
baseUrl = clientsConfig.kodeverkConfig.url,
5454
consumerId = SU_SE_BAKOVER_CONSUMER_ID,
55+
kodeverkClientId = clientsConfig.kodeverkConfig.clientId,
56+
azureAd = oAuth,
5557
)
5658
val tokenOppslag = StsClient(
5759
baseUrl = clientsConfig.stsUrl,

client/src/main/kotlin/no/nav/su/se/bakover/client/StubClientsBuilder.kt

+7-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import no.nav.su.se.bakover.client.stubs.oppgave.OppgaveClientStub
1919
import no.nav.su.se.bakover.client.stubs.pdf.PdfGeneratorStub
2020
import no.nav.su.se.bakover.client.stubs.person.IdentClientStub
2121
import no.nav.su.se.bakover.client.stubs.person.PersonOppslagStub
22-
import no.nav.su.se.bakover.common.SU_SE_BAKOVER_CONSUMER_ID
2322
import no.nav.su.se.bakover.common.domain.auth.TokenOppslag
2423
import no.nav.su.se.bakover.common.domain.kafka.KafkaPublisher
2524
import no.nav.su.se.bakover.common.infrastructure.auth.TokenOppslagStub
@@ -52,12 +51,13 @@ class StubClientsBuilder(
5251
private val log = LoggerFactory.getLogger(this::class.java)
5352

5453
override fun build(applicationConfig: ApplicationConfig): Clients {
54+
val oauth = AzureClient(
55+
applicationConfig.azure.clientId,
56+
applicationConfig.azure.clientSecret,
57+
applicationConfig.azure.wellKnownUrl,
58+
)
5559
return Clients(
56-
oauth = AzureClient(
57-
applicationConfig.azure.clientId,
58-
applicationConfig.azure.clientSecret,
59-
applicationConfig.azure.wellKnownUrl,
60-
),
60+
oauth = oauth,
6161
personOppslag = PersonOppslagStub().also { log.warn("********** Using stub for ${PersonOppslag::class.java} **********") },
6262
tokenOppslag = if (applicationConfig.frikort.useStubForSts) {
6363
TokenOppslagStub.also { log.warn("********** Using stub for ${TokenOppslag::class.java} **********") }
@@ -79,7 +79,7 @@ class StubClientsBuilder(
7979
).also { log.warn("********** Using stubs for ${JournalførClients::class.java} **********") }
8080
},
8181
oppgaveClient = OppgaveClientStub.also { log.warn("********** Using stub for ${OppgaveClient::class.java} **********") },
82-
kodeverk = KodeverkHttpClient(applicationConfig.clientsConfig.kodeverkUrl, SU_SE_BAKOVER_CONSUMER_ID),
82+
kodeverk = KodeverkHttpClient("mocked", "mocked", oauth, "mocked"),
8383
simuleringClient = SimuleringStub(
8484
clock = clock,
8585
utbetalingerKjørtTilOgMed = { LocalDate.now(clock) },
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package no.nav.su.se.bakover.client.kodeverk
22

33
import arrow.core.Either
4+
import no.nav.su.se.bakover.common.infrastructure.token.JwtToken
45

56
interface Kodeverk {
6-
fun hentPoststed(postnummer: String): Either<CouldNotGetKode, String?>
7+
fun hentPoststed(postnummer: String, token: JwtToken): Either<CouldNotGetKode, String?>
78

8-
fun hentKommunenavn(kommunenummer: String): Either<CouldNotGetKode, String?>
9+
fun hentKommunenavn(kommunenummer: String, token: JwtToken): Either<CouldNotGetKode, String?>
910

1011
data object CouldNotGetKode
1112
}

client/src/main/kotlin/no/nav/su/se/bakover/client/kodeverk/KodeverkHttpClient.kt

+20-6
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import arrow.core.left
66
import arrow.core.right
77
import com.github.kittinunf.fuel.httpGet
88
import no.nav.su.se.bakover.client.kodeverk.Kodeverk.CouldNotGetKode
9+
import no.nav.su.se.bakover.common.auth.AzureAd
910
import no.nav.su.se.bakover.common.deserialize
1011
import no.nav.su.se.bakover.common.infrastructure.correlation.getOrCreateCorrelationIdFromThreadLocal
12+
import no.nav.su.se.bakover.common.infrastructure.token.JwtToken
1113
import org.slf4j.Logger
1214
import org.slf4j.LoggerFactory
1315

@@ -19,23 +21,30 @@ internal const val KODEVERK_KOMMUNENAVN_PATH = "/api/v1/kodeverk/Kommuner/koder/
1921
* Swagger: https://kodeverk.dev.intern.nav.no/swagger-ui/index.html#/kodeverk/betydning
2022
* Eksternt repo: https://github.com/navikt/felleskodeverk
2123
*/
22-
class KodeverkHttpClient(val baseUrl: String, private val consumerId: String) : Kodeverk {
24+
class KodeverkHttpClient(
25+
val baseUrl: String,
26+
private val consumerId: String,
27+
private val azureAd: AzureAd,
28+
private val kodeverkClientId: String,
29+
) : Kodeverk {
2330

2431
private val log: Logger = LoggerFactory.getLogger(this::class.java)
2532

26-
override fun hentPoststed(postnummer: String): Either<CouldNotGetKode, String?> {
27-
return hentKodebetydning(KODEVERK_POSTSTED_PATH, postnummer)
33+
override fun hentPoststed(postnummer: String, token: JwtToken): Either<CouldNotGetKode, String?> {
34+
return hentKodebetydning(KODEVERK_POSTSTED_PATH, postnummer, token)
2835
}
2936

30-
override fun hentKommunenavn(kommunenummer: String): Either<CouldNotGetKode, String?> {
31-
return hentKodebetydning(KODEVERK_KOMMUNENAVN_PATH, kommunenummer)
37+
override fun hentKommunenavn(kommunenummer: String, token: JwtToken): Either<CouldNotGetKode, String?> {
38+
return hentKodebetydning(KODEVERK_KOMMUNENAVN_PATH, kommunenummer, token)
3239
}
3340

34-
private fun hentKodebetydning(path: String, value: String): Either<CouldNotGetKode, String?> {
41+
private fun hentKodebetydning(path: String, value: String, token: JwtToken): Either<CouldNotGetKode, String?> {
42+
val bearerToken = token.toBearerToken()
3543
val (_, response, result) = "$baseUrl$path".httpGet()
3644
.header("Content-Type", "application/json")
3745
.header("Nav-Call-Id", getOrCreateCorrelationIdFromThreadLocal())
3846
.header("Nav-Consumer-Id", consumerId)
47+
.header("Authorization", "Bearer $bearerToken")
3948
.apply {
4049
parameters = listOf("ekskluderUgyldige" to "true", "spraak" to "nb")
4150
}
@@ -63,6 +72,11 @@ class KodeverkHttpClient(val baseUrl: String, private val consumerId: String) :
6372
)
6473
}
6574

75+
private fun JwtToken.toBearerToken(): String = when (this) {
76+
is JwtToken.BrukerToken -> azureAd.onBehalfOfToken(this.value, kodeverkClientId)
77+
is JwtToken.SystemToken -> azureAd.getSystemToken(kodeverkClientId)
78+
}
79+
6680
data class KodeverkResponse(
6781
val betydninger: Map<String, List<Betydning>>,
6882
)

client/src/main/kotlin/no/nav/su/se/bakover/client/person/PersonClient.kt

+10-10
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ internal class PersonClient(
7171
): Either<KunneIkkeHentePerson, Person> {
7272
val brukerToken = hentBrukerToken()
7373
return personCache.getOrAdd(Pair(fnr, brukerToken)) {
74-
pdlClient.person(fnr, brukerToken).map { toPerson(it) }
74+
pdlClient.person(fnr, brukerToken).map { toPerson(it, brukerToken) }
7575
}
7676
}
7777

7878
override fun personMedSystembruker(fnr: Fnr): Either<KunneIkkeHentePerson, Person> {
7979
return personCache.getOrAdd(Pair(fnr, JwtToken.SystemToken)) {
80-
pdlClient.personForSystembruker(fnr).map { toPerson(it) }
80+
pdlClient.personForSystembruker(fnr).map { toPerson(it, JwtToken.SystemToken) }
8181
}
8282
}
8383

@@ -94,11 +94,11 @@ internal class PersonClient(
9494
override fun sjekkTilgangTilPerson(fnr: Fnr): Either<KunneIkkeHentePerson, Unit> {
9595
val brukerToken = hentBrukerToken()
9696
return personCache.getOrAdd(Pair(fnr, brukerToken)) {
97-
pdlClient.person(fnr, brukerToken).map { toPerson(it) }
97+
pdlClient.person(fnr, brukerToken).map { toPerson(it, brukerToken) }
9898
}.map { }
9999
}
100100

101-
private fun toPerson(pdlData: PdlData) = Person(
101+
private fun toPerson(pdlData: PdlData, token: JwtToken) = Person(
102102
ident = Ident(pdlData.ident.fnr, pdlData.ident.aktørId),
103103
navn = pdlData.navn.let {
104104
Person.Navn(
@@ -112,11 +112,11 @@ internal class PersonClient(
112112
Person.Adresse(
113113
adresselinje = it.adresselinje,
114114
poststed = it.postnummer?.let { postnummer ->
115-
toPoststed(postnummer)
115+
toPoststed(postnummer, token)
116116
},
117117
bruksenhet = it.bruksenhet,
118118
kommune = it.kommunenummer?.let { kommunenummer ->
119-
toKommune(kommunenummer)
119+
toKommune(kommunenummer, token)
120120
},
121121
landkode = it.landkode,
122122
adressetype = it.adressetype,
@@ -145,14 +145,14 @@ internal class PersonClient(
145145
dødsdato = pdlData.dødsdato,
146146
)
147147

148-
private fun toPoststed(postnummer: String) = Person.Poststed(
148+
private fun toPoststed(postnummer: String, token: JwtToken) = Person.Poststed(
149149
postnummer = postnummer,
150-
poststed = config.kodeverk.hentPoststed(postnummer).getOrNull(),
150+
poststed = config.kodeverk.hentPoststed(postnummer, token).getOrNull(),
151151
)
152152

153-
private fun toKommune(kommunenummer: String) = Person.Kommune(
153+
private fun toKommune(kommunenummer: String, token: JwtToken) = Person.Kommune(
154154
kommunenummer = kommunenummer,
155-
kommunenavn = config.kodeverk.hentKommunenavn(kommunenummer).getOrNull(),
155+
kommunenavn = config.kodeverk.hentKommunenavn(kommunenummer, token).getOrNull(),
156156
)
157157

158158
private fun kontaktinfo(fnr: Fnr): Person.Kontaktinfo? {

client/src/test/kotlin/no/nav/su/se/bakover/client/kodeverk/KodeverkHttpClientTest.kt

+14-10
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@ import arrow.core.right
55
import com.github.tomakehurst.wiremock.client.WireMock
66
import io.kotest.matchers.shouldBe
77
import no.nav.su.se.bakover.client.kodeverk.Kodeverk.CouldNotGetKode
8+
import no.nav.su.se.bakover.client.stubs.azure.AzureClientStub
9+
import no.nav.su.se.bakover.common.infrastructure.token.JwtToken
810
import no.nav.su.se.bakover.test.wiremock.startedWireMockServerWithCorrelationId
911
import org.junit.jupiter.api.Test
1012

1113
internal class KodeverkHttpClientTest {
1214

15+
private val tokenOppslag = AzureClientStub
16+
1317
@Test
1418
fun `Sjekk at vi finner poststed`() {
1519
startedWireMockServerWithCorrelationId {
@@ -19,8 +23,8 @@ internal class KodeverkHttpClientTest {
1923
WireMock.ok(resultatPoststedJson),
2024
),
2125
)
22-
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad")
23-
client.hentPoststed("1479") shouldBe "KURLAND".right()
26+
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad", tokenOppslag, "kodeverkClientId")
27+
client.hentPoststed("1479", JwtToken.SystemToken) shouldBe "KURLAND".right()
2428
}
2529
}
2630

@@ -39,8 +43,8 @@ internal class KodeverkHttpClientTest {
3943
),
4044
)
4145

42-
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad")
43-
client.hentPoststed("1479") shouldBe "KURLAND".right()
46+
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad", tokenOppslag, "kodeverkClientId")
47+
client.hentPoststed("1479", JwtToken.SystemToken) shouldBe "KURLAND".right()
4448
}
4549
}
4650

@@ -53,8 +57,8 @@ internal class KodeverkHttpClientTest {
5357
WireMock.ok(resultatPoststedJson),
5458
),
5559
)
56-
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad")
57-
client.hentPoststed("XXXX") shouldBe null.right()
60+
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad", tokenOppslag, "kodeverkClientId")
61+
client.hentPoststed("XXXX", JwtToken.SystemToken) shouldBe null.right()
5862
}
5963
}
6064

@@ -67,8 +71,8 @@ internal class KodeverkHttpClientTest {
6771
WireMock.serverError(),
6872
),
6973
)
70-
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad")
71-
client.hentPoststed("XXXX") shouldBe CouldNotGetKode.left()
74+
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad", tokenOppslag, "kodeverkClientId")
75+
client.hentPoststed("XXXX", JwtToken.SystemToken) shouldBe CouldNotGetKode.left()
7276
}
7377
}
7478

@@ -83,8 +87,8 @@ internal class KodeverkHttpClientTest {
8387
WireMock.ok(resultatKommuneJson),
8488
),
8589
)
86-
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad")
87-
client.hentKommunenavn("1103") shouldBe "Stavanger".right()
90+
val client = KodeverkHttpClient(baseUrl(), "srvsupstonad", tokenOppslag, "kodeverkClientId")
91+
client.hentKommunenavn("1103", JwtToken.SystemToken) shouldBe "Stavanger".right()
8892
}
8993
}
9094

common/infrastructure/src/main/kotlin/no/nav/su/se/bakover/common/infrastructure/config/ApplicationConfig.kt

+22-3
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ data class ApplicationConfig(
211211
val oppgaveConfig: OppgaveConfig,
212212
val pdlConfig: PdlConfig,
213213
val pdfgenUrl: String,
214-
val kodeverkUrl: String,
215214
val stsUrl: String,
216215
val stsSamlUrl: String,
217216
val skjermingUrl: String,
@@ -221,13 +220,13 @@ data class ApplicationConfig(
221220
val skatteetatenConfig: SkatteetatenConfig,
222221
val dokArkivConfig: DokArkivConfig,
223222
val dokDistConfig: DokDistConfig,
223+
val kodeverkConfig: KodeverkConfig,
224224
) {
225225
companion object {
226226
fun createFromEnvironmentVariables() = ClientsConfig(
227227
oppgaveConfig = OppgaveConfig.createFromEnvironmentVariables(),
228228
pdlConfig = PdlConfig.createFromEnvironmentVariables(),
229229
pdfgenUrl = getEnvironmentVariableOrDefault("PDFGEN_URL", "http://su-pdfgen.supstonad.svc.nais.local"),
230-
kodeverkUrl = getEnvironmentVariableOrThrow("KODEVERK_URL"),
231230
stsUrl = getEnvironmentVariableOrThrow(
232231
"STS_URL",
233232
),
@@ -241,13 +240,13 @@ data class ApplicationConfig(
241240
skatteetatenConfig = SkatteetatenConfig.createFromEnvironmentVariables(),
242241
dokArkivConfig = DokArkivConfig.createFromEnvironmentVariables(),
243242
dokDistConfig = DokDistConfig.createFromEnvironmentVariables(),
243+
kodeverkConfig = KodeverkConfig.createFromEnvironmentVariables(),
244244
)
245245

246246
fun createLocalConfig() = ClientsConfig(
247247
oppgaveConfig = OppgaveConfig.createLocalConfig(),
248248
pdlConfig = PdlConfig.createLocalConfig(),
249249
pdfgenUrl = "mocked",
250-
kodeverkUrl = "mocked",
251250
stsUrl = getEnvironmentVariableOrDefault(
252251
"STS_URL",
253252
"mocked",
@@ -263,6 +262,7 @@ data class ApplicationConfig(
263262
skatteetatenConfig = SkatteetatenConfig.createLocalConfig(),
264263
dokArkivConfig = DokArkivConfig.createLocalConfig(),
265264
dokDistConfig = DokDistConfig.createLocalConfig(),
265+
kodeverkConfig = KodeverkConfig.createLocalConfig(),
266266
)
267267
}
268268

@@ -354,6 +354,25 @@ data class ApplicationConfig(
354354
}
355355
}
356356

357+
data class KodeverkConfig(
358+
val url: String,
359+
val clientId: String,
360+
) {
361+
companion object {
362+
fun createFromEnvironmentVariables() = KodeverkConfig(
363+
url = getEnvironmentVariableOrThrow("KODEVERK_URL"),
364+
clientId = getEnvironmentVariableOrThrow(
365+
"KODEVERK_CLIENT_ID",
366+
),
367+
)
368+
369+
fun createLocalConfig() = KodeverkConfig(
370+
url = "mocked",
371+
clientId = "mocked",
372+
)
373+
}
374+
}
375+
357376
data class SkatteetatenConfig(
358377
val apiBaseUrl: String,
359378
val clientId: String,

common/infrastructure/src/test/kotlin/no/nav/su/se/bakover/common/infrastructure/config/ApplicationConfigTest.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ class ApplicationConfigTest {
104104
clientId = "pdlClientId",
105105
),
106106
pdfgenUrl = "http://su-pdfgen.supstonad.svc.nais.local",
107-
kodeverkUrl = "kodeverkUrl",
108107
stsUrl = "stsUrl",
109108
stsSamlUrl = "stsSamlUrl",
110109
skjermingUrl = "skjermingUrl",
@@ -133,6 +132,10 @@ class ApplicationConfigTest {
133132
url = "dokDistUrl",
134133
clientId = "dokDistClientId",
135134
),
135+
kodeverkConfig = ApplicationConfig.ClientsConfig.KodeverkConfig(
136+
url = "kodeverkUrl",
137+
clientId = "kodeverkClientId",
138+
),
136139
),
137140
kafkaConfig = ApplicationConfig.KafkaConfig(
138141
producerCfg = ApplicationConfig.KafkaConfig.ProducerCfg(
@@ -217,6 +220,7 @@ class ApplicationConfigTest {
217220
"SKATT_CLIENT_ID" to "skattClientId",
218221
"INSTITUSJONSOPPHOLD_TOPIC" to "INSTITUSJONSOPPHOLD_TOPIC",
219222
"KODEVERK_URL" to "kodeverkUrl",
223+
"KODEVERK_CLIENT_ID" to "kodeverkClientId",
220224
),
221225
) {
222226
ApplicationConfig.createFromEnvironmentVariables() shouldBe expectedApplicationConfig
@@ -284,7 +288,6 @@ class ApplicationConfigTest {
284288
clientId = "mocked",
285289
),
286290
pdfgenUrl = "mocked",
287-
kodeverkUrl = "mocked",
288291
stsUrl = "mocked",
289292
stsSamlUrl = "mocked",
290293
skjermingUrl = "mocked",
@@ -313,6 +316,10 @@ class ApplicationConfigTest {
313316
url = "mocked",
314317
clientId = "mocked",
315318
),
319+
kodeverkConfig = ApplicationConfig.ClientsConfig.KodeverkConfig(
320+
url = "mocked",
321+
clientId = "mocked",
322+
),
316323
),
317324
kafkaConfig = ApplicationConfig.KafkaConfig(
318325
producerCfg = ApplicationConfig.KafkaConfig.ProducerCfg((emptyMap())),

0 commit comments

Comments
 (0)