Skip to content

Commit 5090a48

Browse files
docs: legg til README for sikkerhet-modulene
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 920d6e0 commit 5090a48

5 files changed

Lines changed: 419 additions & 0 deletions

File tree

http-client/README.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# http-client
2+
3+
HTTP-klientbibliotek basert på Spring `RestTemplate`. Tilbyr abstrakte baseklasser for REST- og SOAP-klienter, samt interceptorer for Bearer-token-autentisering mot interne Nav-tjenester.
4+
5+
## Innhold
6+
7+
| Klasse | Beskrivelse |
8+
|--------|-------------|
9+
| `AbstractRestClient` | Baseklasse for typede REST-klienter med feilhåndtering og logging |
10+
| `AbstractPingableRestClient` | Utvider `AbstractRestClient` med helsesjekk (`/ping`) |
11+
| `BearerTokenClientInterceptor` | Henter access token automatisk og setter `Authorization: Bearer`-header |
12+
| `BearerTokenClientCredentialsClientInterceptor` | Som over, men tvinger client credentials grant |
13+
| `BearerTokenOnBehalfOfClientInterceptor` | Som over, men tvinger on-behalf-of (JWT bearer) grant |
14+
| `BearerTokenExchangeClientInterceptor` | Som over, men tvinger token exchange grant |
15+
| `ConsumerIdClientInterceptor` | Setter `Nav-Consumer-Id`-header |
16+
| `MdcValuesPropagatingClientInterceptor` | Propagerer MDC-verdier (correlation ID o.l.) til utgående kall |
17+
18+
## Kom i gang
19+
20+
Legg til avhengigheten i `pom.xml`:
21+
22+
```xml
23+
<dependency>
24+
<groupId>no.nav.familie.felles</groupId>
25+
<artifactId>http-client</artifactId>
26+
<version>${familie-felles.version}</version>
27+
</dependency>
28+
```
29+
30+
## Krav: TokenContext-implementasjon
31+
32+
`BearerTokenClientInterceptor` bruker `TokenContextHolder` for å avgjøre om en forespørsel kommer fra et system (ingen innlogget bruker) eller en bruker (on-behalf-of). Uten en konfigurert `TokenContext`-implementasjon kaster interceptoren en `TokenContextNotConfiguredException` ved oppstart.
33+
34+
Legg til én av følgende avhengigheter og importer tilhørende konfigurasjonsklasse:
35+
36+
**Spring Security OAuth2 Resource Server**:
37+
38+
```xml
39+
<dependency>
40+
<groupId>no.nav.familie.felles</groupId>
41+
<artifactId>sikkerhet-spring-security</artifactId>
42+
<version>${familie-felles.version}</version>
43+
</dependency>
44+
```
45+
46+
```kotlin
47+
@Import(FamilieFellesSpringSecurityKonfigurasjon::class)
48+
@SpringBootApplication
49+
class MinApp
50+
```
51+
52+
**Nav token-support**:
53+
54+
```xml
55+
<dependency>
56+
<groupId>no.nav.familie.felles</groupId>
57+
<artifactId>sikkerhet-token-support</artifactId>
58+
<version>${familie-felles.version}</version>
59+
</dependency>
60+
```
61+
62+
```kotlin
63+
@Import(FamilieFellesNavTokenSupportKonfigurasjon::class)
64+
@SpringBootApplication
65+
class MinApp
66+
```
67+
68+
> Importer kun én av disse. Spring kaster feil ved oppstart dersom begge importeres samtidig.
69+
70+
## Bruk
71+
72+
### Implementere en REST-klient
73+
74+
```kotlin
75+
@Service
76+
class MinTjenesteKlient(
77+
restTemplate: RestTemplate,
78+
@Value("\${min-tjeneste.url}") baseUrl: String,
79+
) : AbstractPingableRestClient(restTemplate, "min-tjeneste") {
80+
81+
private val uri = URI.create(baseUrl)
82+
83+
fun hentData(id: String): MinData =
84+
getForEntity(uri.resolve("/api/data/$id"), MinData::class.java)
85+
}
86+
```
87+
88+
### Sette opp RestTemplate med interceptorer
89+
90+
```kotlin
91+
@Import(
92+
BearerTokenClientInterceptor::class,
93+
ConsumerIdClientInterceptor::class
94+
)
95+
class RestTemplateConfig {
96+
@Bean
97+
fun restTemplate(
98+
bearerTokenClientInterceptor: BearerTokenClientInterceptor,
99+
consumerIdClientInterceptor: ConsumerIdClientInterceptor,
100+
): RestTemplate =
101+
RestTemplateBuilder()
102+
.interceptors(
103+
bearerTokenClientInterceptor,
104+
consumerIdClientInterceptor,
105+
).build()
106+
}
107+
```

rest-klient/README.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# rest-klient
2+
3+
HTTP-klientbibliotek basert på Spring `RestTemplate`. Tilbyr abstrakte baseklasser for REST- og SOAP-klienter, samt interceptorer for Bearer-token-autentisering mot interne Nav-tjenester.
4+
5+
## Innhold
6+
7+
| Klasse | Beskrivelse |
8+
|--------|-------------|
9+
| `AbstractRestClient` | Baseklasse for typede REST-klienter med feilhåndtering og logging |
10+
| `AbstractPingableRestClient` | Utvider `AbstractRestClient` med helsesjekk (`/ping`) |
11+
| `BearerTokenClientInterceptor` | Henter access token automatisk og setter `Authorization: Bearer`-header |
12+
| `BearerTokenClientCredentialsClientInterceptor` | Som over, men tvinger client credentials grant |
13+
| `BearerTokenOnBehalfOfClientInterceptor` | Som over, men tvinger on-behalf-of (JWT bearer) grant |
14+
| `BearerTokenExchangeClientInterceptor` | Som over, men tvinger token exchange grant |
15+
| `ConsumerIdClientInterceptor` | Setter `Nav-Consumer-Id`-header |
16+
| `MdcValuesPropagatingClientInterceptor` | Propagerer MDC-verdier (correlation ID o.l.) til utgående kall |
17+
18+
## Kom i gang
19+
20+
Legg til avhengigheten i `pom.xml`:
21+
22+
```xml
23+
<dependency>
24+
<groupId>no.nav.familie.felles</groupId>
25+
<artifactId>rest-klient</artifactId>
26+
<version>${familie-felles.version}</version>
27+
</dependency>
28+
```
29+
30+
## Krav: TokenContext-implementasjon
31+
32+
`BearerTokenClientInterceptor` bruker `TokenContextHolder` for å avgjøre om en forespørsel kommer fra et system (ingen innlogget bruker) eller en bruker (on-behalf-of). Uten en konfigurert `TokenContext`-implementasjon kaster interceptoren en `TokenContextNotConfiguredException` ved oppstart.
33+
34+
Legg til én av følgende avhengigheter og importer tilhørende konfigurasjonsklasse:
35+
36+
**Spring Security OAuth2 Resource Server**:
37+
38+
```xml
39+
<dependency>
40+
<groupId>no.nav.familie.felles</groupId>
41+
<artifactId>sikkerhet-spring-security</artifactId>
42+
<version>${familie-felles.version}</version>
43+
</dependency>
44+
```
45+
46+
```kotlin
47+
@Import(FamilieFellesSpringSecurityKonfigurasjon::class)
48+
@SpringBootApplication
49+
class MinApp
50+
```
51+
52+
**Nav token-support**:
53+
54+
```xml
55+
<dependency>
56+
<groupId>no.nav.familie.felles</groupId>
57+
<artifactId>sikkerhet-token-support</artifactId>
58+
<version>${familie-felles.version}</version>
59+
</dependency>
60+
```
61+
62+
```kotlin
63+
@Import(FamilieFellesNavTokenSupportKonfigurasjon::class)
64+
@SpringBootApplication
65+
class MinApp
66+
```
67+
68+
> Importer kun én av disse. Spring kaster feil ved oppstart dersom begge importeres samtidig.
69+
70+
## Bruk
71+
72+
### Implementere en REST-klient
73+
74+
```kotlin
75+
@Service
76+
class MinTjenesteKlient(
77+
restTemplate: RestTemplate,
78+
@Value("\${min-tjeneste.url}") baseUrl: String,
79+
) : AbstractPingableRestClient(restTemplate, "min-tjeneste") {
80+
81+
private val uri = URI.create(baseUrl)
82+
83+
fun hentData(id: String): MinData =
84+
getForEntity(uri.resolve("/api/data/$id"), MinData::class.java)
85+
}
86+
```
87+
88+
### Sette opp RestTemplate med interceptorer
89+
90+
```kotlin
91+
@Import(
92+
BearerTokenClientInterceptor::class,
93+
ConsumerIdClientInterceptor::class
94+
)
95+
class RestTemplateConfig {
96+
@Bean
97+
fun restTemplate(
98+
bearerTokenClientInterceptor: BearerTokenClientInterceptor,
99+
consumerIdClientInterceptor: ConsumerIdClientInterceptor,
100+
): RestTemplate =
101+
RestTemplateBuilder()
102+
.interceptors(
103+
bearerTokenClientInterceptor,
104+
consumerIdClientInterceptor,
105+
).build()
106+
}
107+
```
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# sikkerhet-spring-security
2+
3+
`TokenContext`-implementasjon basert på **Spring Security OAuth2 Resource Server**.
4+
5+
## Kom i gang
6+
7+
Legg til avhengigheten i `pom.xml`:
8+
9+
```xml
10+
<dependency>
11+
<groupId>no.nav.familie.felles</groupId>
12+
<artifactId>sikkerhet-spring-security</artifactId>
13+
<version>${familie-felles.version}</version>
14+
</dependency>
15+
```
16+
17+
Importer konfigurasjonsklassen i applikasjonens hovedklasse eller en `@Configuration`-klasse:
18+
19+
```kotlin
20+
@Import(FamilieFellesSpringSecurityKonfigurasjon::class)
21+
@SpringBootApplication
22+
class MinApp
23+
```
24+
25+
Dette registrerer `SpringSecurityTokenContext` som aktiv `TokenContext`-implementasjon.
26+
27+
## Issuermapping
28+
29+
`SpringSecurityTokenContext` identifiserer issueren via `iss`-claimet i JWT-en. Resten av biblioteket bruker kortnavn som `"azuread"` og `"tokenx"`, ikke fulle issuer-URLer.
30+
31+
På NAIS bygges mappingen automatisk fra miljøvariablene som NAIS alltid injiserer:
32+
33+
| Miljøvariabel | Kortnavn |
34+
|---|---|
35+
| `AZURE_OPENID_CONFIG_ISSUER` | `"azuread"` |
36+
| `TOKEN_X_ISSUER` | `"tokenx"` |
37+
38+
Du trenger ikke konfigurere noe ekstra. I ikke-NAIS-miljøer (f.eks. lokalt uten disse variablene) brukes full issuer-URL i kall til `TokenContextHolder`.
39+
40+
## Bruk
41+
42+
```kotlin
43+
val saksbehandler = TokenContextHolder.getClaimAsString("NAVident")
44+
val harAzureToken = TokenContextHolder.hasTokenFor("azuread")
45+
val bearerToken = TokenContextHolder.getBearerToken("azuread")
46+
```
47+
48+
## Relaterte moduler
49+
50+
| Modul | Beskrivelse |
51+
|-------|-------------|
52+
| `sikkerhet` | Felles API – `TokenContext`-grensesnitt og `TokenContextHolder` |
53+
| `sikkerhet-token-support` | Alternativ implementasjon basert på Nav token-support |

sikkerhet-token-support/README.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# sikkerhet-token-support
2+
3+
`TokenContext`-implementasjon basert på **Nav token-support** (`token-validation-spring`).
4+
5+
## Kom i gang
6+
7+
Legg til avhengigheten i `pom.xml`:
8+
9+
```xml
10+
<dependency>
11+
<groupId>no.nav.familie.felles</groupId>
12+
<artifactId>sikkerhet-token-support</artifactId>
13+
<version>${familie-felles.version}</version>
14+
</dependency>
15+
```
16+
17+
Importer deretter konfigurasjonsklassen i applikasjonens hovedklasse eller en `@Configuration`-klasse:
18+
19+
```kotlin
20+
@Import(FamilieFellesNavTokenSupportKonfigurasjon::class)
21+
@SpringBootApplication
22+
class MinApp
23+
```
24+
25+
Dette registrerer `NavTokenSupportTokenContext` som aktiv `TokenContext`-implementasjon og gjør `TokenContextHolder` tilgjengelig i hele applikasjonen.
26+
27+
## Forutsetninger
28+
29+
Nav token-support må være konfigurert i `application.properties` / `application.yaml` med de issuerne applikasjonen skal validere tokens for. Se [nais/token-support](https://github.com/navikt/token-support#required-properties-yaml-or-properties) for detaljer.
30+
31+
Kortnavnene du oppgir der (f.eks. `azuread`, `tokenx`) er de samme som brukes i metodekallene på `TokenContextHolder`.
32+
33+
## Bruk
34+
35+
Etter at konfigurasjonen er på plass brukes `TokenContextHolder` direkte:
36+
37+
```kotlin
38+
val saksbehandler = TokenContextHolder.getClaimAsString("NAVident")
39+
val harAzureToken = TokenContextHolder.hasTokenFor("azuread")
40+
val bearerToken = TokenContextHolder.getBearerToken("azuread")
41+
```
42+
43+
## Relaterte moduler
44+
45+
| Modul | Beskrivelse |
46+
|-------|-------------|
47+
| `sikkerhet` | Felles API – `TokenContext`-grensesnitt og `TokenContextHolder` |
48+
| `sikkerhet-spring-security` | Alternativ implementasjon basert på Spring Security OAuth2 Resource Server |

0 commit comments

Comments
 (0)