11package io .quarkiverse .openapi .generator ;
22
3+ import java .util .function .Consumer ;
4+
35import jakarta .annotation .Priority ;
46import jakarta .enterprise .inject .spi .InjectionPoint ;
57import jakarta .ws .rs .Priorities ;
68import jakarta .ws .rs .client .ClientRequestContext ;
9+ import jakarta .ws .rs .core .HttpHeaders ;
710
11+ import org .jboss .logging .Logger ;
812import org .jboss .resteasy .reactive .client .spi .ResteasyReactiveClientRequestContext ;
13+ import org .jboss .resteasy .reactive .client .spi .ResteasyReactiveClientRequestFilter ;
914
1015import io .quarkiverse .openapi .generator .providers .OAuth2AuthenticationProvider ;
11- import io .quarkus .oidc .client .reactive .filter .runtime .AbstractOidcClientRequestReactiveFilter ;
16+ import io .quarkus .oidc .client .Tokens ;
17+ import io .quarkus .oidc .client .runtime .AbstractTokensProducer ;
18+ import io .quarkus .oidc .client .runtime .DisabledOidcClientException ;
19+ import io .quarkus .oidc .common .runtime .OidcConstants ;
1220
1321@ Priority (Priorities .AUTHENTICATION )
1422@ OidcClient
15- public class ReactiveOidcClientRequestFilterDelegate extends AbstractOidcClientRequestReactiveFilter
16- implements OAuth2AuthenticationProvider .OidcClientRequestFilterDelegate {
23+ public class ReactiveOidcClientRequestFilterDelegate extends AbstractTokensProducer
24+ implements ResteasyReactiveClientRequestFilter , OAuth2AuthenticationProvider .OidcClientRequestFilterDelegate {
25+
26+ private static final Logger LOG = Logger
27+ .getLogger (ReactiveOidcClientRequestFilterDelegate .class );
28+ private static final String BEARER_SCHEME_WITH_SPACE = OidcConstants .BEARER_SCHEME + " " ;
1729
1830 ReactiveOidcClientRequestFilterDelegate (InjectionPoint injectionPoint ) {
1931 OidcClient annotation = (OidcClient ) injectionPoint .getQualifiers ().stream ()
@@ -29,8 +41,39 @@ protected java.util.Optional<String> clientId() {
2941 return java .util .Optional .of (clientId );
3042 }
3143
44+ protected void initTokens () {
45+ if (earlyTokenAcquisition ) {
46+ LOG .debug ("Token acquisition will be delayed until this filter is executed to avoid blocking an IO thread" );
47+ }
48+ }
49+
3250 @ Override
3351 public void filter (ClientRequestContext requestContext ) throws java .io .IOException {
34- super .filter ((ResteasyReactiveClientRequestContext ) requestContext );
52+ filter ((ResteasyReactiveClientRequestContext ) requestContext );
53+ }
54+
55+ @ Override
56+ public void filter (ResteasyReactiveClientRequestContext requestContext ) {
57+ requestContext .suspend ();
58+
59+ super .getTokens ().subscribe ().with (new Consumer <>() {
60+ @ Override
61+ public void accept (Tokens tokens ) {
62+ requestContext .getHeaders ().putSingle (HttpHeaders .AUTHORIZATION ,
63+ BEARER_SCHEME_WITH_SPACE + tokens .getAccessToken ());
64+ requestContext .resume ();
65+ }
66+ }, new Consumer <>() {
67+ @ Override
68+ public void accept (Throwable t ) {
69+ if (t instanceof DisabledOidcClientException ) {
70+ LOG .debug ("Client is disabled, acquiring and propagating the token is not necessary" );
71+ requestContext .resume ();
72+ } else {
73+ LOG .debugf ("Access token is not available, cause: %s, aborting the request" , t .getMessage ());
74+ requestContext .resume ((t instanceof RuntimeException ) ? t : new RuntimeException (t ));
75+ }
76+ }
77+ });
3578 }
3679}
0 commit comments