Skip to content

Commit bde1d07

Browse files
committed
add extension function to SignedJWT to verify signature and issuer
1 parent c2f7a28 commit bde1d07

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/main/kotlin/no/nav/security/mock/oauth2/extensions/NimbusExtensions.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
package 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
312
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
416
import com.nimbusds.oauth2.sdk.AuthorizationCode
517
import com.nimbusds.oauth2.sdk.AuthorizationCodeGrant
618
import com.nimbusds.oauth2.sdk.GrantType
719
import com.nimbusds.oauth2.sdk.OAuth2Error
820
import com.nimbusds.oauth2.sdk.TokenRequest
21+
import com.nimbusds.oauth2.sdk.id.Issuer
922
import com.nimbusds.openid.connect.sdk.AuthenticationRequest
1023
import com.nimbusds.openid.connect.sdk.Prompt
1124
import no.nav.security.mock.oauth2.OAuth2Exception
1225
import java.time.Duration
1326
import java.time.Instant
27+
import java.util.HashSet
1428

1529
fun AuthenticationRequest.isPrompt(): Boolean =
1630
this.prompt?.any {
@@ -33,3 +47,22 @@ fun TokenRequest.clientIdAsString(): String =
3347

3448
fun 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

Comments
 (0)