@@ -63,8 +63,9 @@ public CompletableFuture<ClientRegistration> discover(
6363 @ SuppressWarnings ("unchecked" )
6464 final Map <String , Object > jsonResponse =
6565 (Map <String , Object >) jsonDecoder .decode (response , Map .class );
66- OpenIdProviderConfigurationResponse configuration =
66+ final OpenIdProviderConfigurationResponse configuration =
6767 OpenIdProviderConfigurationResponse .fromMap (jsonResponse );
68+ validateIssuer (clientRegistration , configuration );
6869 return toClientRegistration (clientRegistration , configuration );
6970 } else {
7071 final byte [] bytes = Util .toByteArray (response .body ().asInputStream ());
@@ -194,4 +195,24 @@ private static JWTCreator.Builder createJwt(final ClientRegistration clientRegis
194195 .withExpiresAt (new Date (System .currentTimeMillis () + 60 * 1000 )) // 1 minute expiration
195196 .withJWTId (UUID .randomUUID ().toString ()); // Unique identifier
196197 }
198+
199+ /**
200+ * Prevent impersonation attack
201+ *
202+ * @see https://openid.net/specs/openid-connect-discovery-1_0.html#Impersonation
203+ */
204+ private static void validateIssuer (
205+ final ClientRegistration clientRegistration ,
206+ final OpenIdProviderConfigurationResponse configuration ) {
207+ final String originalIssuer =
208+ clientRegistration .getProviderDetails ().getIssuerUri ().replaceAll ("/+$" , "" );
209+ final String configurationIssuer = configuration .getIssuer ().replaceAll ("/+$" , "" );
210+
211+ if (!originalIssuer .equals (configurationIssuer )) {
212+ throw new IllegalStateException (
213+ String .format (
214+ "Issuer in request mismatch issuer in configuration response.\n Original: %s\n Configuration: %s" ,
215+ originalIssuer , configurationIssuer ));
216+ }
217+ }
197218}
0 commit comments