Skip to content

Commit b8e020d

Browse files
authored
add anyToken function to MockOAuth2Server.kt (#26)
* feat: add anyToken function to MockOAuth2Server.kt * can issue any token with the servers jwk, accepting claims as input to function
1 parent a52b644 commit b8e020d

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

src/main/kotlin/no/nav/security/mock/oauth2/MockOAuth2Server.kt

+29
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package no.nav.security.mock.oauth2
22

3+
import com.nimbusds.jwt.JWTClaimsSet
34
import com.nimbusds.jwt.SignedJWT
45
import com.nimbusds.oauth2.sdk.AuthorizationCode
56
import com.nimbusds.oauth2.sdk.AuthorizationCodeGrant
7+
import com.nimbusds.oauth2.sdk.AuthorizationGrant
8+
import com.nimbusds.oauth2.sdk.GrantType
69
import com.nimbusds.oauth2.sdk.TokenRequest
710
import com.nimbusds.oauth2.sdk.auth.ClientSecretBasic
811
import com.nimbusds.oauth2.sdk.auth.Secret
912
import com.nimbusds.oauth2.sdk.id.ClientID
1013
import java.io.IOException
1114
import java.net.InetAddress
1215
import java.net.URI
16+
import java.time.Duration
1317
import java.util.UUID
1418
import mu.KotlinLogging
1519
import no.nav.security.mock.oauth2.extensions.toAuthorizationEndpointUrl
@@ -112,8 +116,33 @@ open class MockOAuth2Server(
112116
expiry
113117
)
114118
)
119+
120+
@JvmOverloads
121+
fun anyToken(issuerUrl: HttpUrl, claims: Map<String, Any>, expiry: Duration = Duration.ofHours(1)): SignedJWT {
122+
val jwtClaimsSet = claims.toJwtClaimsSet()
123+
val mockGrant: AuthorizationGrant = object : AuthorizationGrant(GrantType("MockGrant")) {
124+
override fun toParameters(): MutableMap<String, MutableList<String>> = mutableMapOf()
125+
}
126+
return this.config.tokenProvider.exchangeAccessToken(
127+
TokenRequest(URI.create("http://mockgrant"), mockGrant),
128+
issuerUrl,
129+
jwtClaimsSet,
130+
DefaultOAuth2TokenCallback(
131+
audience = jwtClaimsSet.audience,
132+
expiry = expiry.toMillis()
133+
)
134+
)
135+
}
115136
}
116137

138+
internal fun Map<String, Any>.toJwtClaimsSet(): JWTClaimsSet =
139+
JWTClaimsSet.Builder()
140+
.apply {
141+
this@toJwtClaimsSet.forEach {
142+
this.claim(it.key, it.value)
143+
}
144+
}.build()
145+
117146
fun <R> withMockOAuth2Server(
118147
test: MockOAuth2Server.() -> R
119148
): R {

src/test/kotlin/no/nav/security/mock/oauth2/MockOAuth2ServerTest.kt

+26
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@ import com.nimbusds.jwt.JWTClaimsSet
77
import com.nimbusds.jwt.SignedJWT
88
import com.nimbusds.oauth2.sdk.GrantType
99
import com.nimbusds.oauth2.sdk.id.Issuer
10+
import io.kotest.matchers.maps.shouldContainAll
1011
import io.kotest.matchers.shouldBe
1112
import io.kotest.matchers.string.shouldStartWith
1213
import java.net.URLEncoder
14+
import java.time.Duration
1315
import no.nav.security.mock.oauth2.extensions.verifySignatureAndIssuer
1416
import no.nav.security.mock.oauth2.http.OAuth2HttpResponse
1517
import no.nav.security.mock.oauth2.http.OAuth2TokenResponse
1618
import no.nav.security.mock.oauth2.http.WellKnown
1719
import no.nav.security.mock.oauth2.http.route
20+
import no.nav.security.mock.oauth2.testutils.claims
1821
import no.nav.security.mock.oauth2.testutils.get
1922
import no.nav.security.mock.oauth2.testutils.post
2023
import no.nav.security.mock.oauth2.token.DefaultOAuth2TokenCallback
@@ -388,6 +391,29 @@ class MockOAuth2ServerTest {
388391
assertThat(jwtClaimsSet.getClaim("someclaim")).isEqualTo("claimvalue")
389392
}
390393

394+
@Test
395+
fun `anyToken should issue token with claims from input and be verifyable by servers keys`() {
396+
val issuerId = "issuer1"
397+
val token = server.anyToken(
398+
server.issuerUrl(issuerId),
399+
mutableMapOf(
400+
"sub" to "yolo",
401+
"aud" to listOf("myapp"),
402+
"customInt" to 123,
403+
"customList" to listOf(1, 2, 3)
404+
),
405+
Duration.ofSeconds(10)
406+
)
407+
val jwkSet: JWKSet = retrieveJwks(server.jwksUrl(issuerId).toString())
408+
token.verifySignatureAndIssuer(Issuer(server.issuerUrl("issuer1").toString()), jwkSet)
409+
token.claims shouldContainAll mutableMapOf(
410+
"sub" to "yolo",
411+
"aud" to listOf("myapp"),
412+
"customInt" to 123,
413+
"customList" to listOf(1, 2, 3)
414+
)
415+
}
416+
391417
private fun retrieveJwks(jwksUri: String): JWKSet {
392418
return client.newCall(
393419
Request.Builder()

0 commit comments

Comments
 (0)