1
1
package no.nav.paw.bekreftelse.api.authz
2
2
3
+ import io.ktor.http.HttpHeaders
3
4
import io.ktor.server.application.ApplicationCall
4
5
import io.ktor.server.application.call
5
6
import io.ktor.server.auth.principal
7
+ import io.ktor.server.plugins.BadRequestException
6
8
import io.ktor.server.request.path
7
9
import io.ktor.util.pipeline.PipelineContext
8
10
import io.opentelemetry.instrumentation.annotations.WithSpan
9
- import no.nav.paw.bekreftelse.api.model.Identitetsnummer
11
+ import no.nav.paw.bekreftelse.api.exception.BearerTokenManglerException
12
+ import no.nav.paw.bekreftelse.api.exception.UfullstendigBearerTokenException
13
+ import no.nav.paw.bekreftelse.api.model.BrukerType
14
+ import no.nav.paw.bekreftelse.api.model.InnloggetBruker
15
+ import no.nav.paw.bekreftelse.api.model.Sluttbruker
10
16
import no.nav.paw.bekreftelse.api.services.AutorisasjonService
11
17
import no.nav.paw.kafkakeygenerator.client.KafkaKeysClient
12
18
import no.nav.poao_tilgang.client.TilgangType
13
19
import no.nav.security.token.support.v2.TokenValidationContextPrincipal
14
20
15
21
data class RequestScope (
16
- val identitetsnummer : Identitetsnummer ,
17
- val arbeidssoekerId : Long ,
22
+ val sluttbruker : Sluttbruker ,
23
+ val innloggetBruker : InnloggetBruker ,
18
24
val claims : ResolvedClaims ,
19
25
val path : String ,
20
- val bearerToken : String ,
21
26
val callId : String? ,
22
27
val traceparent : String? ,
23
28
val navConsumerId : String? ,
29
+ val useMockData : Boolean
24
30
)
25
31
32
+ @Suppress(" ConstPropertyName" )
33
+ object NavHttpHeaders {
34
+ const val TraceParent = " traceparent"
35
+ const val NavCallId = " Nav-Call-Id"
36
+ const val NavConsumerId = " Nav-Consumer-Id"
37
+ }
38
+
26
39
@WithSpan
27
40
suspend fun PipelineContext <Unit , ApplicationCall >.requestScope (
28
- identitetsnummer : String ,
41
+ identitetsnummer : String? ,
29
42
kafkaKeyClient : KafkaKeysClient ,
30
43
autorisasjonService : AutorisasjonService , // TODO Legg til autorisasjon
31
44
tilgangType : TilgangType
32
45
): RequestScope {
46
+ val bearerToken = call.request.headers[HttpHeaders .Authorization ]
47
+ ? : throw BearerTokenManglerException (" Request mangler Bearer Token" )
48
+
33
49
val tokenValidationContext = call.principal<TokenValidationContextPrincipal >()
34
50
35
51
val resolvedClaims = tokenValidationContext
@@ -41,17 +57,51 @@ suspend fun PipelineContext<Unit, ApplicationCall>.requestScope(
41
57
TokenXPID
42
58
) ? : ResolvedClaims ()
43
59
44
- val kafkaKeysResponse = kafkaKeyClient.getIdAndKey(identitetsnummer)
45
- val headers = call.request.headers
60
+ if (resolvedClaims.isEmpty()) {
61
+ throw UfullstendigBearerTokenException (" Bearer Token mangler påkrevd innhold" )
62
+ }
46
63
47
- return RequestScope (
48
- identitetsnummer = Identitetsnummer (identitetsnummer),
64
+ // TODO Håndtere at fnr kommer i body
65
+ val resolvedIdentitetsnummer = if (resolvedClaims.isTokenX()) {
66
+ resolvedClaims[TokenXPID ]?.verdi
67
+ ? : throw UfullstendigBearerTokenException (" Bearer Token mangler påkrevd innhold" )
68
+ } else if (resolvedClaims.isAzure()) {
69
+ identitetsnummer ? : throw BadRequestException (" Request mangler identitetsnummer" )
70
+ } else {
71
+ throw UfullstendigBearerTokenException (" Bearer Token er utstedt av ukjent issuer" )
72
+ }
73
+
74
+ val kafkaKeysResponse = kafkaKeyClient.getIdAndKey(resolvedIdentitetsnummer)
75
+ val sluttbruker = Sluttbruker (
76
+ identitetsnummer = resolvedIdentitetsnummer,
49
77
arbeidssoekerId = kafkaKeysResponse.id,
78
+ kafkaKey = kafkaKeysResponse.key
79
+ )
80
+
81
+ val innloggetBruker = if (resolvedClaims.isTokenX()) {
82
+ InnloggetBruker (
83
+ type = BrukerType .SLUTTBRUKER ,
84
+ ident = resolvedIdentitetsnummer,
85
+ bearerToken = bearerToken
86
+ )
87
+ } else {
88
+ val ident = resolvedClaims[AzureNavIdent ]
89
+ ? : throw UfullstendigBearerTokenException (" Bearer Token mangler påkrevd innhold" )
90
+ InnloggetBruker (
91
+ type = BrukerType .VEILEDER ,
92
+ ident = ident,
93
+ bearerToken = bearerToken
94
+ )
95
+ }
96
+
97
+ return RequestScope (
98
+ sluttbruker = sluttbruker,
99
+ innloggetBruker = innloggetBruker,
50
100
claims = resolvedClaims,
51
101
path = call.request.path(),
52
- bearerToken = headers[" Authorization " ] ? : throw BearerTokenManglerException ( " Request mangler Bearer Token " ) ,
53
- callId = headers[" Nav-Call-Id " ],
54
- traceparent = headers[" traceparent " ],
55
- navConsumerId = headers[ " Nav-Consumer-Id " ]
102
+ callId = call.request. headers[NavHttpHeaders . NavCallId ] ,
103
+ traceparent = call.request. headers[NavHttpHeaders . TraceParent ],
104
+ navConsumerId = call.request. headers[NavHttpHeaders . NavConsumerId ],
105
+ useMockData = call.request.queryParameters[ " useMockData " ].toBoolean()
56
106
)
57
107
}
0 commit comments