diff --git a/oauth2/oauth2-jose/src/main/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoder.java b/oauth2/oauth2-jose/src/main/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoder.java index b5652e9fc9..1d1493976b 100644 --- a/oauth2/oauth2-jose/src/main/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoder.java +++ b/oauth2/oauth2-jose/src/main/java/org/springframework/security/oauth2/jwt/NimbusJwtDecoder.java @@ -42,6 +42,7 @@ import com.nimbusds.jose.jwk.source.JWKSetSource; import com.nimbusds.jose.jwk.source.JWKSource; import com.nimbusds.jose.jwk.source.JWKSourceBuilder; +import com.nimbusds.jose.jwk.source.RemoteJWKSet; import com.nimbusds.jose.proc.DefaultJOSEObjectTypeVerifier; import com.nimbusds.jose.proc.JOSEObjectTypeVerifier; import com.nimbusds.jose.proc.JWSKeySelector; @@ -66,6 +67,7 @@ import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.security.oauth2.core.OAuth2Error; import org.springframework.security.oauth2.core.OAuth2TokenValidator; import org.springframework.security.oauth2.core.OAuth2TokenValidatorResult; @@ -293,7 +295,7 @@ public static final class JwkSetUriJwtDecoderBuilder { private final Set signatureAlgorithms = new HashSet<>(); - private RestOperations restOperations = new RestTemplate(); + private RestOperations restOperations = new RestTemplateWithTimeouts(); private Cache cache = new NoOpCache("default"); @@ -545,6 +547,21 @@ public void close() { } + /** + * A RestTemplate with timeouts configured to avoid blocking indefinitely when + * fetching JWK Sets while holding the reentrantLock. + */ + private static final class RestTemplateWithTimeouts extends RestTemplate { + + private RestTemplateWithTimeouts () { + SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + requestFactory.setConnectTimeout(RemoteJWKSet.DEFAULT_HTTP_CONNECT_TIMEOUT); + requestFactory.setReadTimeout(RemoteJWKSet.DEFAULT_HTTP_READ_TIMEOUT); + setRequestFactory(requestFactory); + } + + } + /** * A builder for creating {@link NimbusJwtDecoder} instances based on a public key. */