Skip to content

Commit 5b5e61f

Browse files
committed
Merge pull request #20681 from az1a
* pr/20681: Use jws-algorithm property in ReactiveOAuth2ResourceServerJwkConfiguration Closes gh-20681
2 parents cea1290 + a55c3e4 commit 5b5e61f

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/reactive/ReactiveOAuth2ResourceServerJwkConfiguration.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.context.annotation.Configuration;
3232
import org.springframework.security.config.web.server.ServerHttpSecurity;
3333
import org.springframework.security.config.web.server.ServerHttpSecurity.OAuth2ResourceServerSpec;
34+
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
3435
import org.springframework.security.oauth2.jwt.JwtValidators;
3536
import org.springframework.security.oauth2.jwt.NimbusReactiveJwtDecoder;
3637
import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder;
@@ -45,6 +46,7 @@
4546
* @author Madhura Bhave
4647
* @author Artsiom Yudovin
4748
* @author HaiTao Zhang
49+
* @author Anastasiia Losieva
4850
*/
4951
@Configuration(proxyBeanMethods = false)
5052
class ReactiveOAuth2ResourceServerJwkConfiguration {
@@ -62,8 +64,9 @@ static class JwtConfiguration {
6264
@Bean
6365
@ConditionalOnProperty(name = "spring.security.oauth2.resourceserver.jwt.jwk-set-uri")
6466
ReactiveJwtDecoder jwtDecoder() {
65-
NimbusReactiveJwtDecoder nimbusReactiveJwtDecoder = new NimbusReactiveJwtDecoder(
66-
this.properties.getJwkSetUri());
67+
NimbusReactiveJwtDecoder nimbusReactiveJwtDecoder = NimbusReactiveJwtDecoder
68+
.withJwkSetUri(this.properties.getJwkSetUri())
69+
.jwsAlgorithm(SignatureAlgorithm.from(this.properties.getJwsAlgorithm())).build();
6770
String issuerUri = this.properties.getIssuerUri();
6871
if (issuerUri != null) {
6972
nimbusReactiveJwtDecoder.setJwtValidator(JwtValidators.createDefaultWithIssuer(issuerUri));
@@ -76,7 +79,8 @@ ReactiveJwtDecoder jwtDecoder() {
7679
NimbusReactiveJwtDecoder jwtDecoderByPublicKeyValue() throws Exception {
7780
RSAPublicKey publicKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
7881
.generatePublic(new X509EncodedKeySpec(getKeySpec(this.properties.readPublicKey())));
79-
return NimbusReactiveJwtDecoder.withPublicKey(publicKey).build();
82+
return NimbusReactiveJwtDecoder.withPublicKey(publicKey)
83+
.signatureAlgorithm(SignatureAlgorithm.from(this.properties.getJwsAlgorithm())).build();
8084
}
8185

8286
private byte[] getKeySpec(String keyValue) {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/resource/reactive/ReactiveOAuth2ResourceServerAutoConfigurationTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
import java.util.Collections;
2121
import java.util.HashMap;
2222
import java.util.Map;
23+
import java.util.Set;
2324
import java.util.stream.Stream;
2425

2526
import com.fasterxml.jackson.core.JsonProcessingException;
2627
import com.fasterxml.jackson.databind.ObjectMapper;
28+
import com.nimbusds.jose.JWSAlgorithm;
2729
import okhttp3.mockwebserver.MockResponse;
2830
import okhttp3.mockwebserver.MockWebServer;
2931
import org.junit.jupiter.api.AfterEach;
@@ -68,6 +70,7 @@
6870
* @author Madhura Bhave
6971
* @author Artsiom Yudovin
7072
* @author HaiTao Zhang
73+
* @author Anastasiia Losieva
7174
*/
7275
class ReactiveOAuth2ResourceServerAutoConfigurationTests {
7376

@@ -94,6 +97,31 @@ void autoConfigurationShouldConfigureResourceServer() {
9497
});
9598
}
9699

100+
@SuppressWarnings("unchecked")
101+
@Test
102+
void autoConfigurationUsingJwkSetUriShouldConfigureResourceServerUsingJwsAlgorithm() {
103+
this.contextRunner
104+
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://jwk-set-uri.com",
105+
"spring.security.oauth2.resourceserver.jwt.jws-algorithm=RS512")
106+
.run((context) -> {
107+
NimbusReactiveJwtDecoder nimbusReactiveJwtDecoder = context.getBean(NimbusReactiveJwtDecoder.class);
108+
assertThat(nimbusReactiveJwtDecoder).extracting("jwtProcessor.arg$2")
109+
.matches((algorithms) -> ((Set<JWSAlgorithm>) algorithms).contains(JWSAlgorithm.RS512));
110+
});
111+
}
112+
113+
@Test
114+
void autoConfigurationUsingPublicKeyValueShouldConfigureResourceServerUsingJwsAlgorithm() {
115+
this.contextRunner.withPropertyValues(
116+
"spring.security.oauth2.resourceserver.jwt.public-key-location=classpath:public-key-location",
117+
"spring.security.oauth2.resourceserver.jwt.jws-algorithm=RS384").run((context) -> {
118+
NimbusReactiveJwtDecoder nimbusReactiveJwtDecoder = context.getBean(NimbusReactiveJwtDecoder.class);
119+
assertThat(nimbusReactiveJwtDecoder)
120+
.extracting("jwtProcessor.arg$1.jwsKeySelector.expectedJwsAlgorithm")
121+
.isEqualTo(JWSAlgorithm.RS384);
122+
});
123+
}
124+
97125
@Test
98126
void autoConfigurationShouldConfigureResourceServerUsingOidcIssuerUri() throws IOException {
99127
this.server = new MockWebServer();

0 commit comments

Comments
 (0)