11package no.nav.security.mock.oauth2.extensions
22
3+ import com.nimbusds.jose.JOSEObjectType
4+ import com.nimbusds.jose.JWSAlgorithm
5+ import com.nimbusds.jose.jwk.JWKSet
6+ import com.nimbusds.jose.jwk.source.ImmutableJWKSet
7+ import com.nimbusds.jose.proc.DefaultJOSEObjectTypeVerifier
8+ import com.nimbusds.jose.proc.JWSKeySelector
9+ import com.nimbusds.jose.proc.JWSVerificationKeySelector
10+ import com.nimbusds.jose.proc.SecurityContext
11+ import com.nimbusds.jwt.JWTClaimsSet
312import com.nimbusds.jwt.SignedJWT
13+ import com.nimbusds.jwt.proc.ConfigurableJWTProcessor
14+ import com.nimbusds.jwt.proc.DefaultJWTClaimsVerifier
15+ import com.nimbusds.jwt.proc.DefaultJWTProcessor
416import com.nimbusds.oauth2.sdk.AuthorizationCode
517import com.nimbusds.oauth2.sdk.AuthorizationCodeGrant
618import com.nimbusds.oauth2.sdk.GrantType
719import com.nimbusds.oauth2.sdk.OAuth2Error
820import com.nimbusds.oauth2.sdk.TokenRequest
21+ import com.nimbusds.oauth2.sdk.id.Issuer
922import com.nimbusds.openid.connect.sdk.AuthenticationRequest
1023import com.nimbusds.openid.connect.sdk.Prompt
1124import no.nav.security.mock.oauth2.OAuth2Exception
1225import java.time.Duration
1326import java.time.Instant
27+ import java.util.HashSet
1428
1529fun AuthenticationRequest.isPrompt (): Boolean =
1630 this .prompt?.any {
@@ -33,3 +47,22 @@ fun TokenRequest.clientIdAsString(): String =
3347
3448fun SignedJWT.expiresIn (): Int =
3549 Duration .between(Instant .now(), this .jwtClaimsSet.expirationTime.toInstant()).seconds.toInt()
50+
51+ fun SignedJWT.verifySignatureAndIssuer (issuer : Issuer , jwkSet : JWKSet ): JWTClaimsSet {
52+ val jwtProcessor: ConfigurableJWTProcessor <SecurityContext ?> = DefaultJWTProcessor ()
53+ jwtProcessor.jwsTypeVerifier = DefaultJOSEObjectTypeVerifier (JOSEObjectType (" JWT" ))
54+ val keySelector: JWSKeySelector <SecurityContext ?> = JWSVerificationKeySelector (
55+ JWSAlgorithm .RS256 ,
56+ ImmutableJWKSet (jwkSet)
57+ )
58+ jwtProcessor.jwsKeySelector = keySelector
59+ jwtProcessor.jwtClaimsSetVerifier = DefaultJWTClaimsVerifier (
60+ JWTClaimsSet .Builder ().issuer(issuer.toString()).build(),
61+ HashSet (listOf (" sub" , " iat" , " exp" , " aud" ))
62+ )
63+ return try {
64+ jwtProcessor.process(this , null )
65+ } catch (e: Exception ) {
66+ throw OAuth2Exception (" invalid signed JWT." , e)
67+ }
68+ }
0 commit comments