Skip to content

Commit c895b60

Browse files
authored
Merge pull request #136 from navikt/dev/utvide-api-inngang
Utvidet api-inngang til å kunne bli kalt med M2M-token, med tilhørend…
2 parents b41ff2c + c72961a commit c895b60

File tree

44 files changed

+568
-210
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+568
-210
lines changed

.editorconfig

+9-4
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,23 @@ ij_continuation_indent_size = 8
99
ij_smart_tabs = false
1010

1111
[*.java]
12-
ij_java_imports_layout = *,|,javax.**,java.**,|,$*
12+
ij_java_imports_layout = *, |, javax.**, java.**, |, $*
1313
ij_java_class_count_to_use_import_on_demand = 9999
1414
ij_java_names_count_to_use_import_on_demand = 9999
15-
ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
15+
ij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.*
1616

1717
[{*.kt,*.kts}]
18-
ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^
18+
ij_kotlin_imports_layout = *, java.**, javax.**, kotlin.**, ^
1919
ij_kotlin_name_count_to_use_star_import = 9999
2020
ij_kotlin_name_count_to_use_star_import_for_members = 9999
21-
ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.*,io.ktor.*
21+
ij_kotlin_packages_to_use_import_on_demand = java.util.*, kotlinx.android.synthetic.*, io.ktor.*
2222

2323
[{*.yml,*.yaml}]
2424
indent_size = 2
2525
tab_width = 2
2626
ij_continuation_indent_size = 4
27+
28+
[*.json]
29+
indent_size = 2
30+
tab_width = 2
31+
ij_continuation_indent_size = 4

apps/api-start-stopp-perioder/nais/nais-dev.yaml

+4-5
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,15 @@ spec:
6262
accessPolicy:
6363
inbound:
6464
rules:
65+
- application: aia-backend
6566
- application: arbeidssokerregistrering
6667
- application: arbeidssokerregistrering-for-veileder
67-
- application: aia-backend
68+
- application: paw-arbeidssoekere-synk-jobb
6869
outbound:
6970
rules:
70-
- application: poao-tilgang
71-
namespace: poao
7271
- application: paw-kafka-key-generator
73-
namespace: paw
7472
- application: paw-tilgangskontroll
73+
- application: poao-tilgang
74+
namespace: poao
7575
external:
7676
- host: pdl-api.dev-fss-pub.nais.io
77-

apps/api-start-stopp-perioder/nais/nais-prod.yaml

+3-5
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,14 @@ spec:
6262
accessPolicy:
6363
inbound:
6464
rules:
65+
- application: aia-backend
6566
- application: arbeidssokerregistrering
6667
- application: arbeidssokerregistrering-for-veileder
67-
- application: aia-backend
6868
outbound:
6969
rules:
70-
- application: poao-tilgang
71-
namespace: poao
7270
- application: paw-kafka-key-generator
73-
namespace: paw
7471
- application: paw-tilgangskontroll
72+
- application: poao-tilgang
73+
namespace: poao
7574
external:
7675
- host: pdl-api.prod-fss-pub.nais.io
77-

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/AuthOpplysningerTilHendelseOpplysniinger.kt

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
package no.nav.paw.arbeidssokerregisteret
22

3-
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.*
4-
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.*
3+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning
4+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.AnsattIkkeTilgang
5+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.AnsattTilgang
6+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.IkkeAnsatt
7+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.IkkeSystem
8+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.IkkeSammeSomInnloggerBruker
9+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.SystemIkkeTilgang
10+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.SystemTilgang
11+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.SammeSomInnloggetBruker
12+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.TokenXPidIkkeFunnet
513
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Opplysning
614

715
fun authOpplysningTilHendelseOpplysning(opplysning: AuthOpplysning): Opplysning =
@@ -12,4 +20,7 @@ fun authOpplysningTilHendelseOpplysning(opplysning: AuthOpplysning): Opplysning
1220
AnsattIkkeTilgang -> Opplysning.ANSATT_IKKE_TILGANG
1321
AnsattTilgang -> Opplysning.ANSATT_TILGANG
1422
IkkeAnsatt -> Opplysning.IKKE_ANSATT
23+
SystemIkkeTilgang -> Opplysning.SYSTEM_IKKE_TILGANG
24+
SystemTilgang -> Opplysning.SYSTEM_TILGANG
25+
IkkeSystem -> Opplysning.IKKE_SYSTEM
1526
}

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/RequestScope.kt

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
package no.nav.paw.arbeidssokerregisteret
22

3-
import io.ktor.server.auth.*
4-
import io.ktor.server.request.*
3+
import io.ktor.server.auth.principal
4+
import io.ktor.server.request.path
55
import io.ktor.server.routing.RoutingContext
66
import io.opentelemetry.instrumentation.annotations.WithSpan
7-
import no.nav.paw.arbeidssokerregisteret.utils.*
7+
import no.nav.paw.arbeidssokerregisteret.utils.AzureAzpName
8+
import no.nav.paw.arbeidssokerregisteret.utils.AzureName
9+
import no.nav.paw.arbeidssokerregisteret.utils.AzureNavIdent
10+
import no.nav.paw.arbeidssokerregisteret.utils.AzureOID
11+
import no.nav.paw.arbeidssokerregisteret.utils.AzureRoles
12+
import no.nav.paw.arbeidssokerregisteret.utils.ResolvedClaims
13+
import no.nav.paw.arbeidssokerregisteret.utils.TokenXPID
14+
import no.nav.paw.arbeidssokerregisteret.utils.resolveClaims
815
import no.nav.security.token.support.v3.TokenValidationContextPrincipal
916

1017
data class RequestScope(
@@ -21,9 +28,11 @@ fun RoutingContext.requestScope(): RequestScope {
2128
val resolvedClaims = tokenValidationContext
2229
?.context
2330
?.resolveClaims(
31+
AzureOID,
2432
AzureName,
2533
AzureNavIdent,
26-
AzureOID,
34+
AzureRoles,
35+
AzureAzpName,
2736
TokenXPID
2837
) ?: ResolvedClaims()
2938
val headers = call.request.headers

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RequestValidator.kt

+17-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
package no.nav.paw.arbeidssokerregisteret.application
22

33
import arrow.core.Either
4-
import arrow.core.NonEmptyList
54
import arrow.core.flatMap
65
import arrow.core.partially1
76
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry
87
import io.opentelemetry.instrumentation.annotations.WithSpan
98
import no.nav.paw.arbeidssokerregisteret.RequestScope
9+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.systemTilgangFakta
1010
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.navAnsattTilgangFakta
11-
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.tokenXPidFakta
12-
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.*
11+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.sluttbrukerTilgangFakta
12+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning
13+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning
14+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.adreseOpplysning
15+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.alderOpplysning
16+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.euEoesStatsborgerOpplysning
17+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.forenkletFregOpplysning
18+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.gbrStatsborgerOpplysning
19+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.norskStatsborgerOpplysning
20+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.oppholdstillatelseOpplysning
21+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.plus
22+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.utflyttingOpplysning
1323
import no.nav.paw.arbeidssokerregisteret.application.regler.TilgangsRegler
1424
import no.nav.paw.arbeidssokerregisteret.domain.Identitetsnummer
1525
import no.nav.paw.arbeidssokerregisteret.services.AutorisasjonService
@@ -26,6 +36,7 @@ class RequestValidator(
2636
) {
2737

2838
private val sjekkOmNavAnsattHarTilgang = ::navAnsattTilgangFakta.partially1(autorisasjonService)
39+
private val sjekkOmSystemHarTilgang = ::systemTilgangFakta.partially1(autorisasjonService)
2940

3041
@WithSpan
3142
suspend fun validerTilgang(
@@ -34,12 +45,14 @@ class RequestValidator(
3445
erForhaandsGodkjentAvVeileder: Boolean = false,
3546
feilretting: Feilretting? = null
3647
): Either<PawNonEmptyList<Problem>, GrunnlagForGodkjenning> {
37-
val autentiseringsFakta = requestScope.tokenXPidFakta(identitetsnummer) +
48+
val autentiseringsFakta = requestScope.sluttbrukerTilgangFakta(identitetsnummer) +
3849
sjekkOmNavAnsattHarTilgang(requestScope, identitetsnummer) +
50+
sjekkOmSystemHarTilgang(requestScope) +
3951
listOfNotNull(
4052
if (erForhaandsGodkjentAvVeileder) DomeneOpplysning.ErForhaandsgodkjent else null,
4153
feilretting?.let { DomeneOpplysning.ErFeilretting }
4254
)
55+
4356
return TilgangsRegler.evaluer(autentiseringsFakta)
4457
}
4558

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/ResultatTilHendelse.kt

+30-9
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,20 @@ import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysni
1010
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning
1111
import no.nav.paw.arbeidssokerregisteret.authOpplysningTilHendelseOpplysning
1212
import no.nav.paw.arbeidssokerregisteret.domain.Identitetsnummer
13+
import no.nav.paw.arbeidssokerregisteret.domain.m2mToken
1314
import no.nav.paw.arbeidssokerregisteret.domain.navAnsatt
14-
import no.nav.paw.arbeidssokerregisteret.intern.v1.*
15-
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.*
16-
import no.nav.paw.arbeidssokerregisteret.utils.TokenXPID
15+
import no.nav.paw.arbeidssokerregisteret.domain.sluttbruker
16+
import no.nav.paw.arbeidssokerregisteret.intern.v1.Avsluttet
17+
import no.nav.paw.arbeidssokerregisteret.intern.v1.Avvist
18+
import no.nav.paw.arbeidssokerregisteret.intern.v1.AvvistStoppAvPeriode
19+
import no.nav.paw.arbeidssokerregisteret.intern.v1.Hendelse
20+
import no.nav.paw.arbeidssokerregisteret.intern.v1.OpplysningerOmArbeidssoekerMottatt
21+
import no.nav.paw.arbeidssokerregisteret.intern.v1.Startet
22+
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Bruker
23+
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.BrukerType
24+
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Metadata
25+
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.OpplysningerOmArbeidssoeker
26+
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.TidspunktFraKilde
1727
import no.nav.paw.collections.PawNonEmptyList
1828
import java.time.Instant
1929
import java.util.*
@@ -70,7 +80,10 @@ fun somHendelse(
7080
id = id,
7181
hendelseId = UUID.randomUUID(),
7282
identitetsnummer = identitetsnummer.verdi,
73-
metadata = hendelseMetadata(requestScope, resultat.value.map { it.regel.id.beskrivelse }.toList().joinToString(". ")),
83+
metadata = hendelseMetadata(
84+
requestScope = requestScope,
85+
aarsak = resultat.value.map { it.regel.id.beskrivelse }.toList().joinToString(". ")
86+
),
7487
opplysninger = resultat.value.first.opplysninger.map(::mapToHendelseOpplysning).toSet(),
7588
handling = requestScope.path
7689
)
@@ -79,7 +92,10 @@ fun somHendelse(
7992
id = id,
8093
hendelseId = UUID.randomUUID(),
8194
identitetsnummer = identitetsnummer.verdi,
82-
metadata = hendelseMetadata(requestScope, resultat.value.regel.id.beskrivelse),
95+
metadata = hendelseMetadata(
96+
requestScope = requestScope,
97+
aarsak = resultat.value.regel.id.beskrivelse
98+
),
8399
opplysninger = resultat.value.opplysning.map(::mapToHendelseOpplysning).toSet()
84100
)
85101
}
@@ -120,15 +136,20 @@ fun hendelseMetadata(
120136
)
121137

122138
fun RequestScope.brukerFraClaims(): Bruker {
123-
return claims[TokenXPID]?.let { foedselsnummer ->
139+
return sluttbruker(claims)?.let {
124140
Bruker(
125141
type = BrukerType.SLUTTBRUKER,
126-
id = foedselsnummer.verdi
142+
id = it.identitetsnummer.verdi
127143
)
128-
} ?: navAnsatt(claims)?.let { navAnsatt ->
144+
} ?: navAnsatt(claims)?.let {
129145
Bruker(
130146
type = BrukerType.VEILEDER,
131-
id = navAnsatt.ident
147+
id = it.ident
148+
)
149+
} ?: m2mToken(claims)?.let {
150+
Bruker(
151+
type = BrukerType.SYSTEM,
152+
id = it.tjeneste
132153
)
133154
} ?: throw IllegalStateException("Kunne ikke finne bruker i claims")
134155
}

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/authfaktka/AuthOpplysninger.kt

+18-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Effect
44
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning
55

66

7-
sealed interface AuthOpplysning: Opplysning {
7+
sealed interface AuthOpplysning : Opplysning {
88

99
data object IkkeSammeSomInnloggerBruker : AuthOpplysning, Effect.Negative {
1010
override val id = "IKKE_SAMME_SOM_INNLOGGER_BRUKER"
@@ -38,4 +38,21 @@ sealed interface AuthOpplysning: Opplysning {
3838
override val id = "IKKE_ANSATT"
3939
override val beskrivelse = "Innlogget bruker er ikke en NAV-ansatt"
4040
}
41+
42+
data object SystemIkkeTilgang : AuthOpplysning, Effect.Negative {
43+
override val id = "SYSTEM_IKKE_TILGANG"
44+
override val beskrivelse =
45+
"System uten tilgang til å utføre start/stopp av perioder"
46+
}
47+
48+
data object SystemTilgang : AuthOpplysning, Effect.Positive {
49+
override val id = "SYSTEM_TILGANG"
50+
override val beskrivelse =
51+
"System med tilgang til å utføre start/stopp av perioder"
52+
}
53+
54+
data object IkkeSystem : AuthOpplysning, Effect.Neutral {
55+
override val id = "IKKE_SYSTEM"
56+
override val beskrivelse = "Ikke system"
57+
}
4158
}

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/authfaktka/TokenXPidFakta.kt apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/authfaktka/SluttbrukerTilgangFakta.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning
77
import no.nav.paw.arbeidssokerregisteret.domain.Identitetsnummer
88
import no.nav.paw.arbeidssokerregisteret.utils.TokenXPID
99

10-
fun RequestScope.tokenXPidFakta(identitetsnummer: Identitetsnummer): Opplysning {
10+
fun RequestScope.sluttbrukerTilgangFakta(identitetsnummer: Identitetsnummer): Opplysning {
1111
return (claims[TokenXPID]?.let { authenticatedUser ->
1212
if (authenticatedUser != identitetsnummer) {
1313
IkkeSammeSomInnloggerBruker
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package no.nav.paw.arbeidssokerregisteret.application.authfaktka
2+
3+
import io.opentelemetry.api.trace.Span
4+
import no.nav.paw.arbeidssokerregisteret.RequestScope
5+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.IkkeSystem
6+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.SystemIkkeTilgang
7+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning.SystemTilgang
8+
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning
9+
import no.nav.paw.arbeidssokerregisteret.domain.m2mToken
10+
import no.nav.paw.arbeidssokerregisteret.services.AutorisasjonService
11+
12+
fun systemTilgangFakta(
13+
autorisasjonService: AutorisasjonService,
14+
requestScope: RequestScope
15+
): Opplysning {
16+
val m2MToken = m2mToken(requestScope.claims)
17+
return (if (m2MToken != null) {
18+
if (autorisasjonService.verifiserSystemTilgangTilBruker(m2MToken)) {
19+
SystemTilgang
20+
} else {
21+
SystemIkkeTilgang
22+
}
23+
} else {
24+
IkkeSystem
25+
}).also { opplysning ->
26+
Span.current()
27+
.setAttribute("paw_m2m_token_tilgang", opplysning.toString())
28+
}
29+
}

apps/api-start-stopp-perioder/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/regler/TilgangsRegler.kt

+25-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package no.nav.paw.arbeidssokerregisteret.application.regler
22

3-
import no.nav.paw.arbeidssokerregisteret.application.*
4-
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.*
3+
import no.nav.paw.arbeidssokerregisteret.application.Regel
4+
import no.nav.paw.arbeidssokerregisteret.application.RegelId
5+
import no.nav.paw.arbeidssokerregisteret.application.Regler
6+
import no.nav.paw.arbeidssokerregisteret.application.authfaktka.AuthOpplysning
7+
import no.nav.paw.arbeidssokerregisteret.application.grunnlagForGodkjenning
8+
import no.nav.paw.arbeidssokerregisteret.application.invoke
59
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning
10+
import no.nav.paw.arbeidssokerregisteret.application.skalAvises
611

7-
object TilgangsRegler: Regler {
12+
object TilgangsRegler : Regler {
813
override val regler: List<Regel> = listOf(
914
AnsattHarTilgangTilBruker(
1015
AuthOpplysning.AnsattTilgang,
@@ -36,6 +41,14 @@ object TilgangsRegler: Regler {
3641
AnsattIkkeTilgangTilBruker(
3742
AuthOpplysning.AnsattIkkeTilgang,
3843
vedTreff = ::skalAvises
44+
),
45+
SystemHarIkkeTilgangTilBruker(
46+
AuthOpplysning.SystemIkkeTilgang,
47+
vedTreff = ::skalAvises
48+
),
49+
SystemHarTilgangTilBruker(
50+
AuthOpplysning.SystemTilgang,
51+
vedTreff = ::grunnlagForGodkjenning
3952
)
4053
)
4154

@@ -45,7 +58,7 @@ object TilgangsRegler: Regler {
4558

4659
}
4760

48-
sealed interface AuthRegelId: RegelId
61+
sealed interface AuthRegelId : RegelId
4962

5063
data object IkkeTilgang : AuthRegelId {
5164
override val beskrivelse: String = "Ikke tilgang"
@@ -78,3 +91,11 @@ data object UgyldigFeilretting : AuthRegelId {
7891
data object AnsattHarTilgangTilBruker : AuthRegelId {
7992
override val beskrivelse: String = "Ansatt har tilgang til bruker"
8093
}
94+
95+
data object SystemHarIkkeTilgangTilBruker : AuthRegelId {
96+
override val beskrivelse: String = "System har ikke tilgang til bruker"
97+
}
98+
99+
data object SystemHarTilgangTilBruker : AuthRegelId {
100+
override val beskrivelse: String = "System har tilgang til bruker"
101+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package no.nav.paw.arbeidssokerregisteret.domain
2+
3+
import no.nav.paw.arbeidssokerregisteret.utils.AzureAzpName
4+
import no.nav.paw.arbeidssokerregisteret.utils.AzureRoles
5+
import no.nav.paw.arbeidssokerregisteret.utils.ResolvedClaims
6+
7+
data class M2MToken(val tjeneste: String)
8+
9+
fun m2mToken(claims: ResolvedClaims): M2MToken? {
10+
val roles = claims[AzureRoles]
11+
val azp = claims[AzureAzpName]
12+
return if (roles != null && azp != null && roles.contains("access_as_application")) {
13+
M2MToken(azp)
14+
} else {
15+
null
16+
}
17+
}

0 commit comments

Comments
 (0)