2222import io .quarkiverse .openapi .generator .OidcClient ;
2323import io .quarkiverse .openapi .generator .OpenApiGeneratorConfig ;
2424import io .quarkiverse .openapi .generator .OpenApiSpec ;
25- import io .quarkiverse .openapi .generator .markers .ApiKeyAuthenticationMarker ;
26- import io .quarkiverse .openapi .generator .markers .BasicAuthenticationMarker ;
27- import io .quarkiverse .openapi .generator .markers .BearerAuthenticationMarker ;
28- import io .quarkiverse .openapi .generator .markers .OauthAuthenticationMarker ;
29- import io .quarkiverse .openapi .generator .markers .OperationMarker ;
25+ import io .quarkiverse .openapi .generator .markers .*;
3026import io .quarkiverse .openapi .generator .oidc .ClassicOidcClientRequestFilterDelegate ;
3127import io .quarkiverse .openapi .generator .oidc .OidcAuthenticationRecorder ;
3228import io .quarkiverse .openapi .generator .oidc .ReactiveOidcClientRequestFilterDelegate ;
@@ -51,6 +47,8 @@ public class GeneratorProcessor {
5147
5248 private static final String FEATURE = "openapi-generator" ;
5349 private static final DotName OAUTH_AUTHENTICATION_MARKER = DotName .createSimple (OauthAuthenticationMarker .class );
50+ private static final DotName OPEN_ID_CONNECT_AUTHENTICATION_MARKER = DotName
51+ .createSimple (OpenIdConnectAuthenticationMarker .class );
5452 private static final DotName BASIC_AUTHENTICATION_MARKER = DotName .createSimple (BasicAuthenticationMarker .class );
5553 private static final DotName BEARER_AUTHENTICATION_MARKER = DotName .createSimple (BearerAuthenticationMarker .class );
5654 private static final DotName API_KEY_AUTHENTICATION_MARKER = DotName .createSimple (ApiKeyAuthenticationMarker .class );
@@ -185,6 +183,68 @@ void produceOauthAuthentication(CombinedIndexBuildItem beanArchiveBuildItem,
185183 }
186184 }
187185
186+ @ BuildStep
187+ @ Record (ExecutionTime .RUNTIME_INIT )
188+ void produceOpenIdConnectAuthentication (CombinedIndexBuildItem beanArchiveBuildItem ,
189+ BuildProducer <AuthProviderBuildItem > authenticationProviders ,
190+ BuildProducer <SyntheticBeanBuildItem > beanProducer ,
191+ OidcAuthenticationRecorder oidcRecorder ) {
192+
193+ Collection <AnnotationInstance > authenticationMarkers = beanArchiveBuildItem .getIndex ()
194+ .getAnnotationsWithRepeatable (OPEN_ID_CONNECT_AUTHENTICATION_MARKER , beanArchiveBuildItem .getIndex ())
195+ .stream ()
196+ .collect (Collectors .toMap (
197+ AnnotationInstance ::equivalenceHashCode ,
198+ marker -> marker ,
199+ (existing , duplicate ) -> existing ))
200+ .values ();
201+
202+ if (!isClassPresentAtRuntime (ABSTRACT_TOKEN_PRODUCER )) {
203+ if (!authenticationMarkers .isEmpty ()) {
204+ throw new IllegalStateException (
205+ "OAuth2 flows detected in spec(s) " +
206+ authenticationMarkers .stream ()
207+ .map (m -> m .value ("openApiSpecId" ).asString ())
208+ .distinct ()
209+ .collect (Collectors .joining (", " ))
210+ +
211+ " but quarkus-openapi-generator-oidc and quarkus-rest-client-oidc-filter or quarkus-oidc-client-reactive-filter are not on the classpath. "
212+ +
213+ "Please add those dependencies to your project. See https://docs.quarkiverse.io/quarkus-openapi-generator/dev/client.html#_oauth2_authentication" );
214+ }
215+ LOGGER .debug ("{} class not found in runtime, skipping OAuth bean generation" , ABSTRACT_TOKEN_PRODUCER );
216+ return ;
217+ }
218+ LOGGER .debug ("{} class found in runtime, producing OAuth bean generation" , ABSTRACT_TOKEN_PRODUCER );
219+
220+ Map <String , List <AnnotationInstance >> operationsBySpec = getOperationsBySpec (beanArchiveBuildItem );
221+
222+ for (AnnotationInstance authenticationMarker : authenticationMarkers ) {
223+ String name = authenticationMarker .value ("name" ).asString ();
224+ String openApiSpecId = authenticationMarker .value ("openApiSpecId" ).asString ();
225+ List <OperationAuthInfo > operations = getOperations (operationsBySpec , openApiSpecId , name );
226+ authenticationProviders .produce (new AuthProviderBuildItem (openApiSpecId , name ));
227+ beanProducer .produce (SyntheticBeanBuildItem .configure (AuthProvider .class )
228+ .scope (Dependent .class )
229+ .addQualifier ()
230+ .annotation (AuthName .class )
231+ .addValue ("name" , name )
232+ .done ()
233+ .addQualifier ()
234+ .annotation (OpenApiSpec .class )
235+ .addValue ("openApiSpecId" , openApiSpecId )
236+ .done ()
237+ .addInjectionPoint (ClassType .create (DotName .createSimple (CredentialsProvider .class )))
238+ .addInjectionPoint (ClassType .create (OAuth2AuthenticationProvider .OidcClientRequestFilterDelegate .class ),
239+ AnnotationInstance .builder (OidcClient .class ).add ("name" , sanitizeAuthName (name )).build ())
240+ .addInjectionPoint (ClassType .create (DotName .createSimple (CredentialsProvider .class )))
241+ .createWith (oidcRecorder .recordOauthAuthProvider (sanitizeAuthName (name ), openApiSpecId , operations ))
242+ .setRuntimeInit ()
243+ .unremovable ()
244+ .done ());
245+ }
246+ }
247+
188248 @ BuildStep
189249 @ Record (ExecutionTime .RUNTIME_INIT )
190250 void produceBasicAuthentication (CombinedIndexBuildItem beanArchiveBuildItem ,
0 commit comments