1
1
package no.nav.security.mock.oauth2.extensions
2
2
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
3
12
import 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
4
16
import com.nimbusds.oauth2.sdk.AuthorizationCode
5
17
import com.nimbusds.oauth2.sdk.AuthorizationCodeGrant
6
18
import com.nimbusds.oauth2.sdk.GrantType
7
19
import com.nimbusds.oauth2.sdk.OAuth2Error
8
20
import com.nimbusds.oauth2.sdk.TokenRequest
21
+ import com.nimbusds.oauth2.sdk.id.Issuer
9
22
import com.nimbusds.openid.connect.sdk.AuthenticationRequest
10
23
import com.nimbusds.openid.connect.sdk.Prompt
11
24
import no.nav.security.mock.oauth2.OAuth2Exception
12
25
import java.time.Duration
13
26
import java.time.Instant
27
+ import java.util.HashSet
14
28
15
29
fun AuthenticationRequest.isPrompt (): Boolean =
16
30
this .prompt?.any {
@@ -33,3 +47,22 @@ fun TokenRequest.clientIdAsString(): String =
33
47
34
48
fun SignedJWT.expiresIn (): Int =
35
49
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