Skip to content

Commit 37e1931

Browse files
Ping (#2)
* Lag pingendepunkt og app config
1 parent db0414f commit 37e1931

File tree

6 files changed

+175
-1
lines changed

6 files changed

+175
-1
lines changed

src/main/kotlin/no/nav/ks/barnehagelister/Application.kt src/main/kotlin/no/nav/familie/ks/barnehagelister/Application.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package no.nav.ks.barnehagelister
1+
package no.nav.familie.ks.barnehagelister
22

33
import org.springframework.boot.autoconfigure.SpringBootApplication
44
import org.springframework.boot.runApplication
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package no.nav.familie.ks.barnehagelister.config
2+
3+
import no.nav.familie.http.interceptor.ConsumerIdClientInterceptor
4+
import no.nav.familie.log.filter.LogFilter
5+
import org.slf4j.LoggerFactory
6+
import org.springframework.boot.SpringBootConfiguration
7+
import org.springframework.boot.context.properties.ConfigurationPropertiesScan
8+
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory
9+
import org.springframework.boot.web.servlet.FilterRegistrationBean
10+
import org.springframework.boot.web.servlet.server.ServletWebServerFactory
11+
import org.springframework.context.annotation.Bean
12+
import org.springframework.context.annotation.ComponentScan
13+
import org.springframework.context.annotation.Import
14+
import org.springframework.scheduling.annotation.EnableScheduling
15+
16+
@SpringBootConfiguration
17+
@ConfigurationPropertiesScan("no.nav.familie")
18+
@ComponentScan("no.nav.familie.ks.barnehagelister")
19+
@Import(ConsumerIdClientInterceptor::class)
20+
@EnableScheduling
21+
class ApplicationConfig {
22+
@Bean
23+
fun servletWebServerFactory(): ServletWebServerFactory {
24+
val serverFactory = JettyServletWebServerFactory()
25+
serverFactory.port = 8096
26+
return serverFactory
27+
}
28+
29+
@Bean
30+
fun logFilter(): FilterRegistrationBean<LogFilter> {
31+
log.info("Registering LogFilter filter")
32+
val filterRegistration: FilterRegistrationBean<LogFilter> = FilterRegistrationBean()
33+
filterRegistration.filter = LogFilter()
34+
filterRegistration.order = 1
35+
return filterRegistration
36+
}
37+
38+
companion object {
39+
private val log = LoggerFactory.getLogger(ApplicationConfig::class.java)
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package no.nav.familie.ks.barnehagelister.rest
2+
3+
import no.nav.security.token.support.core.api.ProtectedWithClaims
4+
import org.slf4j.LoggerFactory
5+
import org.springframework.http.ResponseEntity
6+
import org.springframework.validation.annotation.Validated
7+
import org.springframework.web.bind.annotation.GetMapping
8+
import org.springframework.web.bind.annotation.RequestMapping
9+
import org.springframework.web.bind.annotation.RestController
10+
11+
@ProtectedWithClaims(issuer = "maskinporten", claimMap = ["scope=nav:familie/v1/kontantstotte/barnehagelister"])
12+
@RestController
13+
@Validated
14+
@RequestMapping("/barnehagelister")
15+
class BarnehagelisterController {
16+
private val logger = LoggerFactory.getLogger(BarnehagelisterController::class.java)
17+
18+
@GetMapping(path = ["/ping"])
19+
fun ping(): ResponseEntity<String> {
20+
logger.info("Mottok ping")
21+
return ResponseEntity.ok("pong")
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package no.nav.familie.ks.barnehagelister
2+
3+
import no.nav.familie.ks.barnehagelister.config.ApplicationConfig
4+
import org.springframework.boot.SpringApplication
5+
import org.springframework.context.annotation.Import
6+
7+
@Import(ApplicationConfig::class)
8+
class DevLauncher
9+
10+
fun main(args: Array<String>) {
11+
System.setProperty("spring.profiles.active", "dev")
12+
val springApp = SpringApplication(DevLauncher::class.java)
13+
springApp.setAdditionalProfiles("dev")
14+
springApp.run(*args)
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package no.nav.familie.ba.skatteetaten.maskinporten
2+
3+
import com.nimbusds.jose.JOSEException
4+
import com.nimbusds.jose.JOSEObjectType
5+
import com.nimbusds.jose.JWSAlgorithm
6+
import com.nimbusds.jose.JWSHeader
7+
import com.nimbusds.jose.JWSSigner
8+
import com.nimbusds.jose.crypto.RSASSASigner
9+
import com.nimbusds.jose.jwk.RSAKey
10+
import com.nimbusds.jwt.JWTClaimsSet
11+
import com.nimbusds.jwt.SignedJWT
12+
import org.springframework.http.HttpEntity
13+
import org.springframework.http.HttpHeaders
14+
import org.springframework.http.HttpMethod
15+
import org.springframework.http.MediaType
16+
import org.springframework.util.LinkedMultiValueMap
17+
import org.springframework.web.client.RestTemplate
18+
import java.time.Instant
19+
import java.util.Date
20+
21+
fun main() {
22+
val jwkPrivate: String = System.getenv("MASKINPORTEN_CLIENT_JWK")
23+
assert(jwkPrivate.isNotBlank())
24+
val clientId: String = System.getenv("MASKINPORTEN_CLIENT_ID")
25+
assert(clientId.isNotBlank())
26+
27+
val token = MaskinportenClient().hentToken("nav:familie/v1/kontantstotte/barnehagelister", jwkPrivate, clientId)
28+
29+
println(token)
30+
}
31+
32+
class MaskinportenClient {
33+
private val restTemplate = RestTemplate()
34+
35+
private fun createSignedJWT(
36+
rsaJwk: RSAKey,
37+
claimsSet: JWTClaimsSet?,
38+
): SignedJWT =
39+
try {
40+
val header =
41+
JWSHeader
42+
.Builder(JWSAlgorithm.RS256)
43+
.keyID(rsaJwk.keyID)
44+
.type(JOSEObjectType.JWT)
45+
val signedJWT = SignedJWT(header.build(), claimsSet)
46+
val signer: JWSSigner = RSASSASigner(rsaJwk.toPrivateKey())
47+
signedJWT.sign(signer)
48+
signedJWT
49+
} catch (e: JOSEException) {
50+
throw RuntimeException(e)
51+
}
52+
53+
fun hentToken(
54+
scope: String,
55+
jwkPrivate: String,
56+
clientId: String,
57+
): String {
58+
val rsaKey = RSAKey.parse(jwkPrivate)
59+
val time = Instant.now()
60+
val jwtClaimsSet =
61+
JWTClaimsSet
62+
.Builder()
63+
.audience(AUD)
64+
.issuer(clientId)
65+
.issueTime(Date.from(time))
66+
.expirationTime(Date.from(time.plusSeconds(120)))
67+
.claim(SCOPE, scope)
68+
.build()
69+
val signedJWT = createSignedJWT(rsaKey, jwtClaimsSet)
70+
val headers = HttpHeaders()
71+
headers.contentType = MediaType.APPLICATION_FORM_URLENCODED
72+
val requestBody = LinkedMultiValueMap<Any, Any>()
73+
requestBody.add("grant_type", GRANT_TYPE_VALUE)
74+
requestBody.add("assertion", signedJWT.serialize())
75+
val httpEntity = HttpEntity(requestBody, headers)
76+
val json =
77+
restTemplate
78+
.exchange(
79+
TOKEN_ENDPOINT,
80+
HttpMethod.POST,
81+
httpEntity,
82+
String::class.java,
83+
).body!!
84+
85+
return json
86+
}
87+
88+
companion object {
89+
private const val SCOPE = "scope"
90+
private const val GRANT_TYPE_VALUE = "urn:ietf:params:oauth:grant-type:jwt-bearer"
91+
private const val AUD = "https://test.maskinporten.no/"
92+
private const val TOKEN_ENDPOINT = "$AUD/token"
93+
}
94+
}
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
MASKINPORTEN_WELL_KNOWN_URL: https://login.microsoftonline.com/navq.onmicrosoft.com/v2.0/.well-known/openid-configuration

0 commit comments

Comments
 (0)