@@ -2,9 +2,14 @@ package no.nav.security.mock.oauth2
2
2
3
3
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
4
4
import com.fasterxml.jackson.module.kotlin.readValue
5
+ import com.nimbusds.jose.jwk.JWKSet
6
+ import com.nimbusds.jwt.JWTClaimsSet
5
7
import com.nimbusds.jwt.SignedJWT
6
8
import com.nimbusds.oauth2.sdk.GrantType
9
+ import com.nimbusds.oauth2.sdk.id.Issuer
10
+ import no.nav.security.mock.oauth2.extensions.verifySignatureAndIssuer
7
11
import no.nav.security.mock.oauth2.http.OAuth2TokenResponse
12
+ import no.nav.security.mock.oauth2.http.WellKnown
8
13
import no.nav.security.mock.oauth2.token.DefaultOAuth2TokenCallback
9
14
import no.nav.security.mock.oauth2.token.OAuth2TokenProvider
10
15
import okhttp3.Credentials
@@ -52,6 +57,31 @@ class MockOAuth2ServerTest {
52
57
interactiveLoginServer.shutdown()
53
58
}
54
59
60
+ @Test
61
+ fun startServerWithFixedPort () {
62
+ val serverWithFixedPort = MockOAuth2Server ()
63
+ serverWithFixedPort.start(1234 )
64
+ val wellKnown: WellKnown = assertWellKnownResponseForIssuer(serverWithFixedPort, " default" )
65
+
66
+ val tokenIssuedDirectlyFromServer: SignedJWT = serverWithFixedPort.issueToken(" default" , " yo" , DefaultOAuth2TokenCallback ())
67
+ assertThat(tokenIssuedDirectlyFromServer.verifySignatureAndIssuer(Issuer (wellKnown.issuer), retrieveJwks(wellKnown.jwksUri))).isNotNull
68
+
69
+ val authCodeTokenResponse: Response = client.newCall(
70
+ authCodeTokenRequest(
71
+ wellKnown.tokenEndpoint.toHttpUrlOrNull()!! ,
72
+ " client" ,
73
+ " someredirect" ,
74
+ " scope1" ,
75
+ " 123"
76
+ )
77
+ ).execute()
78
+
79
+ val tokenResponse: OAuth2TokenResponse = jacksonObjectMapper().readValue(authCodeTokenResponse.body!! .string())
80
+ val tokenFromAuthCode: SignedJWT = tokenResponse.idToken!! .let { SignedJWT .parse(it) }
81
+ assertThat(tokenFromAuthCode.verifySignatureAndIssuer(Issuer (wellKnown.issuer), retrieveJwks(wellKnown.jwksUri))).isNotNull
82
+ serverWithFixedPort.shutdown()
83
+ }
84
+
55
85
@Test
56
86
fun wellKnownUrlForMultipleIssuers () {
57
87
assertWellKnownResponseForIssuer(" default" )
@@ -62,9 +92,10 @@ class MockOAuth2ServerTest {
62
92
@Test
63
93
fun enqueuedResponse () {
64
94
assertWellKnownResponseForIssuer(" default" )
65
- server.enqueueResponse(MockResponse ()
66
- .setResponseCode(200 )
67
- .setBody(" some body" )
95
+ server.enqueueResponse(
96
+ MockResponse ()
97
+ .setResponseCode(200 )
98
+ .setBody(" some body" )
68
99
)
69
100
val request: Request = Request .Builder ()
70
101
.url(server.url(" /someurl" ))
@@ -281,6 +312,52 @@ class MockOAuth2ServerTest {
281
312
assertThat(accessToken.jwtClaimsSet.issuer).endsWith(" default" )
282
313
}
283
314
315
+ @Test
316
+ fun issueTokenDirectlyFromMockOAuth2Server () {
317
+ val signedJWT: SignedJWT = server.issueToken(
318
+ " default" , " client1" , DefaultOAuth2TokenCallback (
319
+ issuerId = " default" ,
320
+ subject = " mysub" ,
321
+ audience = " muyaud" ,
322
+ claims = mapOf (" someclaim" to " claimvalue" )
323
+ )
324
+ )
325
+ val wellKnownResponseBody = assertWellKnownResponseForIssuer(" default" )!!
326
+ val wellKnown: WellKnown = jacksonObjectMapper().readValue(wellKnownResponseBody)
327
+ val jwkSet: JWKSet = retrieveJwks(wellKnown.jwksUri)
328
+ val jwtClaimsSet: JWTClaimsSet = signedJWT.verifySignatureAndIssuer(Issuer (wellKnown.issuer), jwkSet)
329
+ assertThat(jwtClaimsSet.issuer).isEqualTo(wellKnown.issuer)
330
+ assertThat(jwtClaimsSet.subject).isEqualTo(" mysub" )
331
+ assertThat(jwtClaimsSet.audience).containsExactly(" muyaud" )
332
+ assertThat(jwtClaimsSet.getClaim(" someclaim" )).isEqualTo(" claimvalue" )
333
+ }
334
+
335
+ private fun retrieveJwks (jwksUri : String ): JWKSet {
336
+ return client.newCall(
337
+ Request .Builder ()
338
+ .url(jwksUri)
339
+ .get()
340
+ .build()
341
+ ).execute().body?.string()?.let {
342
+ JWKSet .parse(it)
343
+ } ? : throw RuntimeException (" could not retrieve jwks" )
344
+ }
345
+
346
+ private fun assertWellKnownResponseForIssuer (mockOAuth2Server : MockOAuth2Server , issuerId : String ): WellKnown {
347
+ val wellKnownResponse: Response = client.newCall(
348
+ Request .Builder ()
349
+ .url(mockOAuth2Server.wellKnownUrl(issuerId))
350
+ .get()
351
+ .build()
352
+ ).execute()
353
+ val wellKnown: WellKnown = jacksonObjectMapper().readValue(wellKnownResponse.body!! .string())
354
+ assertThat(wellKnown.issuer).isEqualTo(mockOAuth2Server.issuerUrl(issuerId).toString())
355
+ assertThat(wellKnown.authorizationEndpoint).isEqualTo(mockOAuth2Server.authorizationEndpointUrl(issuerId).toString())
356
+ assertThat(wellKnown.tokenEndpoint).isEqualTo(mockOAuth2Server.tokenEndpointUrl(issuerId).toString())
357
+ assertThat(wellKnown.jwksUri).isEqualTo(mockOAuth2Server.jwksUrl(issuerId).toString())
358
+ return wellKnown
359
+ }
360
+
284
361
private fun assertWellKnownResponseForIssuer (issuerId : String ): String? {
285
362
val request: Request = Request .Builder ()
286
363
.url(server.wellKnownUrl(issuerId))
0 commit comments