|
21 | 21 | import java.util.LinkedHashMap;
|
22 | 22 | import java.util.List;
|
23 | 23 | import java.util.Map;
|
| 24 | +import java.util.function.Supplier; |
24 | 25 |
|
25 | 26 | import com.nimbusds.oauth2.sdk.GrantType;
|
26 | 27 | import com.nimbusds.oauth2.sdk.ParseException;
|
@@ -86,10 +87,7 @@ public final class ClientRegistrations {
|
86 | 87 | */
|
87 | 88 | public static ClientRegistration.Builder fromOidcIssuerLocation(String issuer) {
|
88 | 89 | Assert.hasText(issuer, "issuer cannot be empty");
|
89 |
| - Map<String, Object> configuration = getConfiguration(issuer, oidc(URI.create(issuer))); |
90 |
| - OIDCProviderMetadata metadata = parse(configuration, OIDCProviderMetadata::parse); |
91 |
| - return withProviderConfiguration(metadata, issuer) |
92 |
| - .userInfoUri(metadata.getUserInfoEndpointURI().toASCIIString()); |
| 90 | + return getBuilder(issuer, oidc(URI.create(issuer))); |
93 | 91 | }
|
94 | 92 |
|
95 | 93 | /**
|
@@ -137,42 +135,68 @@ public static ClientRegistration.Builder fromOidcIssuerLocation(String issuer) {
|
137 | 135 | public static ClientRegistration.Builder fromIssuerLocation(String issuer) {
|
138 | 136 | Assert.hasText(issuer, "issuer cannot be empty");
|
139 | 137 | URI uri = URI.create(issuer);
|
140 |
| - Map<String, Object> configuration = getConfiguration(issuer, oidc(uri), oidcRfc8414(uri), oauth(uri)); |
141 |
| - AuthorizationServerMetadata metadata = parse(configuration, AuthorizationServerMetadata::parse); |
142 |
| - ClientRegistration.Builder builder = withProviderConfiguration(metadata, issuer); |
143 |
| - String userinfoEndpoint = (String) configuration.get("userinfo_endpoint"); |
144 |
| - if (userinfoEndpoint != null) { |
145 |
| - builder.userInfoUri(userinfoEndpoint); |
146 |
| - } |
147 |
| - return builder; |
| 138 | + return getBuilder(issuer, oidc(uri), oidcRfc8414(uri), oauth(uri)); |
148 | 139 | }
|
149 | 140 |
|
150 |
| - private static URI oidc(URI issuer) { |
151 |
| - return UriComponentsBuilder.fromUri(issuer) |
| 141 | + private static Supplier<ClientRegistration.Builder> oidc(URI issuer) { |
| 142 | + URI uri = UriComponentsBuilder.fromUri(issuer) |
152 | 143 | .replacePath(issuer.getPath() + OIDC_METADATA_PATH).build(Collections.emptyMap());
|
| 144 | + |
| 145 | + return () -> { |
| 146 | + RequestEntity<Void> request = RequestEntity.get(uri).build(); |
| 147 | + Map<String, Object> configuration = rest.exchange(request, typeReference).getBody(); |
| 148 | + OIDCProviderMetadata metadata = parse(configuration, OIDCProviderMetadata::parse); |
| 149 | + return withProviderConfiguration(metadata, issuer.toASCIIString()) |
| 150 | + .jwkSetUri(metadata.getJWKSetURI().toASCIIString()) |
| 151 | + .userInfoUri(metadata.getUserInfoEndpointURI().toASCIIString()); |
| 152 | + }; |
153 | 153 | }
|
154 | 154 |
|
155 |
| - private static URI oidcRfc8414(URI issuer) { |
156 |
| - return UriComponentsBuilder.fromUri(issuer) |
| 155 | + private static Supplier<ClientRegistration.Builder> oidcRfc8414(URI issuer) { |
| 156 | + URI uri = UriComponentsBuilder.fromUri(issuer) |
157 | 157 | .replacePath(OIDC_METADATA_PATH + issuer.getPath()).build(Collections.emptyMap());
|
| 158 | + return getRfc8414Builder(issuer, uri); |
158 | 159 | }
|
159 | 160 |
|
160 |
| - private static URI oauth(URI issuer) { |
161 |
| - return UriComponentsBuilder.fromUri(issuer) |
| 161 | + private static Supplier<ClientRegistration.Builder> oauth(URI issuer) { |
| 162 | + URI uri = UriComponentsBuilder.fromUri(issuer) |
162 | 163 | .replacePath(OAUTH_METADATA_PATH + issuer.getPath()).build(Collections.emptyMap());
|
| 164 | + return getRfc8414Builder(issuer, uri); |
| 165 | + } |
| 166 | + |
| 167 | + private static Supplier<ClientRegistration.Builder> getRfc8414Builder(URI issuer, URI uri) { |
| 168 | + return () -> { |
| 169 | + RequestEntity<Void> request = RequestEntity.get(uri).build(); |
| 170 | + Map<String, Object> configuration = rest.exchange(request, typeReference).getBody(); |
| 171 | + AuthorizationServerMetadata metadata = parse(configuration, AuthorizationServerMetadata::parse); |
| 172 | + ClientRegistration.Builder builder = withProviderConfiguration(metadata, issuer.toASCIIString()); |
| 173 | + |
| 174 | + URI jwkSetUri = metadata.getJWKSetURI(); |
| 175 | + if (jwkSetUri != null) { |
| 176 | + builder.jwkSetUri(jwkSetUri.toASCIIString()); |
| 177 | + } |
| 178 | + |
| 179 | + String userinfoEndpoint = (String) configuration.get("userinfo_endpoint"); |
| 180 | + if (userinfoEndpoint != null) { |
| 181 | + builder.userInfoUri(userinfoEndpoint); |
| 182 | + } |
| 183 | + return builder; |
| 184 | + }; |
163 | 185 | }
|
164 | 186 |
|
165 |
| - private static Map<String, Object> getConfiguration(String issuer, URI... uris) { |
| 187 | + @SafeVarargs |
| 188 | + private static ClientRegistration.Builder getBuilder(String issuer, Supplier<ClientRegistration.Builder>... suppliers) { |
166 | 189 | String errorMessage = "Unable to resolve Configuration with the provided Issuer of \"" + issuer + "\"";
|
167 |
| - for (URI uri : uris) { |
| 190 | + for (Supplier<ClientRegistration.Builder> supplier : suppliers) { |
168 | 191 | try {
|
169 |
| - RequestEntity<Void> request = RequestEntity.get(uri).build(); |
170 |
| - return rest.exchange(request, typeReference).getBody(); |
| 192 | + return supplier.get(); |
171 | 193 | } catch (HttpClientErrorException e) {
|
172 | 194 | if (!e.getStatusCode().is4xxClientError()) {
|
173 | 195 | throw e;
|
174 | 196 | }
|
175 | 197 | // else try another endpoint
|
| 198 | + } catch (IllegalArgumentException | IllegalStateException e) { |
| 199 | + throw e; |
176 | 200 | } catch (RuntimeException e) {
|
177 | 201 | throw new IllegalArgumentException(errorMessage, e);
|
178 | 202 | }
|
@@ -219,7 +243,6 @@ private static ClientRegistration.Builder withProviderConfiguration(Authorizatio
|
219 | 243 | .clientAuthenticationMethod(method)
|
220 | 244 | .redirectUriTemplate("{baseUrl}/{action}/oauth2/code/{registrationId}")
|
221 | 245 | .authorizationUri(metadata.getAuthorizationEndpointURI().toASCIIString())
|
222 |
| - .jwkSetUri(metadata.getJWKSetURI().toASCIIString()) |
223 | 246 | .providerConfigurationMetadata(configurationMetadata)
|
224 | 247 | .tokenUri(metadata.getTokenEndpointURI().toASCIIString())
|
225 | 248 | .clientName(issuer);
|
|
0 commit comments