@@ -63,8 +63,9 @@ public CompletableFuture<ClientRegistration> discover(
63
63
@ SuppressWarnings ("unchecked" )
64
64
final Map <String , Object > jsonResponse =
65
65
(Map <String , Object >) jsonDecoder .decode (response , Map .class );
66
- OpenIdProviderConfigurationResponse configuration =
66
+ final OpenIdProviderConfigurationResponse configuration =
67
67
OpenIdProviderConfigurationResponse .fromMap (jsonResponse );
68
+ validateIssuer (clientRegistration , configuration );
68
69
return toClientRegistration (clientRegistration , configuration );
69
70
} else {
70
71
final byte [] bytes = Util .toByteArray (response .body ().asInputStream ());
@@ -194,4 +195,24 @@ private static JWTCreator.Builder createJwt(final ClientRegistration clientRegis
194
195
.withExpiresAt (new Date (System .currentTimeMillis () + 60 * 1000 )) // 1 minute expiration
195
196
.withJWTId (UUID .randomUUID ().toString ()); // Unique identifier
196
197
}
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
+ }
197
218
}
0 commit comments