diff --git a/README.md b/README.md index e4df35a..ed368c1 100644 --- a/README.md +++ b/README.md @@ -291,7 +291,7 @@ Disable Property: `org.springframework.cloud.bindings.boot.oauth2.enable` | `spring.security.oauth2.client.registration.{name}.client-name` | `{client-name}` | `spring.security.oauth2.client.registration.{name}.client-authentication-method` | `{client-authentication-method}` | `spring.security.oauth2.client.registration.{name}.authorization-grant-type` | `{authorization-grant-type}` or if not set then `{authorization-grant-types}` if it contains only one value (comma-separated) -| `spring.security.oauth2.client.registration.{name}.redirect-uri` | `{redirect-uri}` +| `spring.security.oauth2.client.registration.{name}.redirect-uri` | `{redirect-uri}` or if not set then `{redirect-uris}` if it contains only one value (comma-separated) | `spring.security.oauth2.client.registration.{name}.scope` | `{scope}` | `spring.security.oauth2.client.provider.{provider}.issuer-uri` | `{issuer-uri}` | `spring.security.oauth2.client.provider.{provider}.authorization-uri` | `{authorization-uri}` diff --git a/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java index 28fca47..fde51b1 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java @@ -64,6 +64,9 @@ public final class SpringSecurityOAuth2BindingsPropertiesProcessor implements Bi .when(SpringSecurityOAuth2BindingsPropertiesProcessor::hasSingleValue) .toIfAbsent(String.format("spring.security.oauth2.client.registration.%s.authorization-grant-type", clientName)); map.from("redirect-uri").to(String.format("spring.security.oauth2.client.registration.%s.redirect-uri", clientName)); + map.from("redirect-uris") + .when(SpringSecurityOAuth2BindingsPropertiesProcessor::hasSingleValue) + .toIfAbsent(String.format("spring.security.oauth2.client.registration.%s.redirect-uri", clientName)); map.from("scope").to(String.format("spring.security.oauth2.client.registration.%s.scope", clientName)); map.from("client-name").to(String.format("spring.security.oauth2.client.registration.%s.client-name", clientName)); map.from("issuer-uri").to(String.format("spring.security.oauth2.client.provider.%s.issuer-uri", provider)); diff --git a/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java index 176895b..db39e80 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java @@ -166,6 +166,49 @@ final class SpringSecurityOAuth2BindingsPropertiesProcessorTest { .containsEntry("spring.security.oauth2.client.registration.binding-name.authorization-grant-type", "client_credentials"); } + @Test + @DisplayName("contributes a redirect-uri is there is only one in redirect-uris") + void testRedirectUrisOneEntry() { + Bindings bindings = new Bindings(new Binding("binding-name", Paths.get("test-path"), + new FluentMap() + .withEntry(Binding.TYPE, TYPE) + .withEntry("provider", "some-provider") + .withEntry("redirect-uris", "https://app.example.com/authorized") + )); + new SpringSecurityOAuth2BindingsPropertiesProcessor().process(new MockEnvironment(), bindings, properties); + assertThat(properties) + .containsEntry("spring.security.oauth2.client.registration.binding-name.redirect-uri", "https://app.example.com/authorized"); + } + + @Test + @DisplayName("does not contributes a redirect-uri is there are multiple entries in redirect-uris") + void testRedirectUrisMultipleEntries() { + Bindings bindings = new Bindings(new Binding("binding-name", Paths.get("test-path"), + new FluentMap() + .withEntry(Binding.TYPE, TYPE) + .withEntry("provider", "some-provider") + .withEntry("redirect-uris", "https://app.example.com/authorized,https://other-app.example.com/login") + )); + new SpringSecurityOAuth2BindingsPropertiesProcessor().process(new MockEnvironment(), bindings, properties); + assertThat(properties) + .doesNotContainKey("spring.security.oauth2.client.registration.binding-name.redirect-uri"); + } + + @Test + @DisplayName("uses the value from redirect-uri if redirect-uris is also present") + void testRedirectUriAndRedirectUris() { + Bindings bindings = new Bindings(new Binding("binding-name", Paths.get("test-path"), + new FluentMap() + .withEntry(Binding.TYPE, TYPE) + .withEntry("provider", "some-provider") + .withEntry("redirect-uris", "https://app.example.com/authorized") + .withEntry("redirect-uri", "https://other-app.example.com/login") + )); + new SpringSecurityOAuth2BindingsPropertiesProcessor().process(new MockEnvironment(), bindings, properties); + assertThat(properties) + .containsEntry("spring.security.oauth2.client.registration.binding-name.redirect-uri", "https://other-app.example.com/login"); + } + @Test @DisplayName("can be disabled") void disabled() {