Skip to content

Commit 89010a2

Browse files
committed
Add builder to create NimbusJwtDecoder with JwkSource
Signed-off-by: Mark Bonnekessel <[email protected]>
1 parent 07a50b4 commit 89010a2

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

oauth2/oauth2-jose/src/main/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoder.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,16 @@ public static SecretKeyJwtDecoderBuilder withSecretKey(SecretKey secretKey) {
261261
return new SecretKeyJwtDecoderBuilder(secretKey);
262262
}
263263

264+
/**
265+
* Use the given <a href="https://tools.ietf.org/html/rfc7517#section-5">JWK Set</a>
266+
* uri.
267+
* @param jwkSetUri the JWK Set uri to use
268+
* @return a {@link JwkSetUriJwtDecoderBuilder} for further configurations
269+
*/
270+
public static JwkSetUriJwtDecoderBuilder withJwkSource(JWKSource<SecurityContext> jwkSetUri) {
271+
return new JwkSetUriJwtDecoderBuilder(jwkSetUri);
272+
}
273+
264274
/**
265275
* A builder for creating {@link NimbusJwtDecoder} instances based on a
266276
* <a target="_blank" href="https://tools.ietf.org/html/rfc7517#section-5">JWK Set</a>
@@ -274,7 +284,7 @@ public static final class JwkSetUriJwtDecoderBuilder {
274284
private static final JOSEObjectTypeVerifier<SecurityContext> NO_TYPE_VERIFIER = (header, context) -> {
275285
};
276286

277-
private final Function<RestOperations, String> jwkSetUri;
287+
private Function<RestOperations, String> jwkSetUri;
278288

279289
private Function<JWKSource<SecurityContext>, Set<JWSAlgorithm>> defaultAlgorithms = (source) -> Set
280290
.of(JWSAlgorithm.RS256);
@@ -289,6 +299,8 @@ public static final class JwkSetUriJwtDecoderBuilder {
289299

290300
private Consumer<ConfigurableJWTProcessor<SecurityContext>> jwtProcessorCustomizer;
291301

302+
private JWKSource<SecurityContext> jwkSource;
303+
292304
private JwkSetUriJwtDecoderBuilder(String jwkSetUri) {
293305
Assert.hasText(jwkSetUri, "jwkSetUri cannot be empty");
294306
this.jwkSetUri = (rest) -> jwkSetUri;
@@ -306,6 +318,13 @@ private JwkSetUriJwtDecoderBuilder(Function<RestOperations, String> jwkSetUri,
306318
};
307319
}
308320

321+
private JwkSetUriJwtDecoderBuilder(JWKSource<SecurityContext> jwkSource) {
322+
Assert.notNull(jwkSource, "jwkSource cannot be null");
323+
this.jwkSource = jwkSource;
324+
this.jwtProcessorCustomizer = (processor) -> {
325+
};
326+
}
327+
309328
/**
310329
* Whether to use Nimbus's typ header verification. This is {@code true} by
311330
* default, however it may change to {@code false} in a future major release.
@@ -436,6 +455,9 @@ JWSKeySelector<SecurityContext> jwsKeySelector(JWKSource<SecurityContext> jwkSou
436455
}
437456

438457
JWKSource<SecurityContext> jwkSource() {
458+
if (this.jwkSource != null) {
459+
return this.jwkSource;
460+
}
439461
String jwkSetUri = this.jwkSetUri.apply(this.restOperations);
440462
return JWKSourceBuilder.create(new SpringJWKSource<>(this.restOperations, this.cache, jwkSetUri))
441463
.refreshAheadCache(false)

oauth2/oauth2-jose/src/test/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoderTests.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.nimbusds.jose.JWSSigner;
4343
import com.nimbusds.jose.crypto.MACSigner;
4444
import com.nimbusds.jose.crypto.RSASSASigner;
45+
import com.nimbusds.jose.jwk.JWKSet;
4546
import com.nimbusds.jose.jwk.source.JWKSource;
4647
import com.nimbusds.jose.proc.BadJOSEException;
4748
import com.nimbusds.jose.proc.DefaultJOSEObjectTypeVerifier;
@@ -559,6 +560,22 @@ public void decodeWhenUsingSecretKeyWithKidThenStillUsesKey() throws Exception {
559560
// @formatter:on
560561
}
561562

563+
// gh-7056
564+
@Test
565+
public void decodeWhenUsingJwkSource() throws Exception {
566+
JWKSource<SecurityContext> source = (a, b) -> {
567+
try {
568+
return JWKSet.parse(JWK_SET).getKeys();
569+
}
570+
catch (ParseException e) {
571+
throw new RuntimeException(e);
572+
}
573+
};
574+
NimbusJwtDecoder decoder = NimbusJwtDecoder.withJwkSource(source).build();
575+
Jwt jwt = decoder.decode(SIGNED_JWT);
576+
assertThat(jwt.getClaimAsString("sub")).isEqualTo("test-subject");
577+
}
578+
562579
// gh-8730
563580
@Test
564581
public void withSecretKeyWhenUsingCustomTypeHeaderThenSuccessfullyDecodes() throws Exception {

0 commit comments

Comments
 (0)