Skip to content

Commit c3a9660

Browse files
committed
Throw the exception if OIDC client fails to acquire the token
1 parent 0c7eece commit c3a9660

File tree

10 files changed

+119
-10
lines changed

10 files changed

+119
-10
lines changed

extensions/oidc-client-filter/runtime/src/main/java/io/quarkus/oidc/client/filter/runtime/AbstractOidcClientRequestFilter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import jakarta.ws.rs.client.ClientRequestContext;
66
import jakarta.ws.rs.client.ClientRequestFilter;
77
import jakarta.ws.rs.core.HttpHeaders;
8-
import jakarta.ws.rs.core.Response;
98

109
import org.jboss.logging.Logger;
1110

@@ -26,10 +25,11 @@ public void filter(ClientRequestContext requestContext) throws IOException {
2625
final String accessToken = getAccessToken();
2726
requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, BEARER_SCHEME_WITH_SPACE + accessToken);
2827
} catch (DisabledOidcClientException ex) {
29-
requestContext.abortWith(Response.status(500).build());
28+
LOG.debug("Client is disabled, aborting the request");
29+
throw ex;
3030
} catch (Exception ex) {
31-
LOG.debugf("Access token is not available, aborting the request with HTTP 401 error: %s", ex.getMessage());
32-
requestContext.abortWith(Response.status(401).build());
31+
LOG.debugf("Access token is not available, cause: %s, aborting the request", ex.getMessage());
32+
throw (ex instanceof RuntimeException) ? (RuntimeException) ex : new RuntimeException(ex);
3333
}
3434
}
3535

extensions/oidc-client-reactive-filter/runtime/src/main/java/io/quarkus/oidc/client/reactive/filter/runtime/AbstractOidcClientRequestReactiveFilter.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.util.function.Consumer;
44

55
import jakarta.ws.rs.core.HttpHeaders;
6-
import jakarta.ws.rs.core.Response;
76

87
import org.jboss.logging.Logger;
98
import org.jboss.resteasy.reactive.client.spi.ResteasyReactiveClientRequestContext;
@@ -40,13 +39,11 @@ public void accept(Tokens tokens) {
4039
@Override
4140
public void accept(Throwable t) {
4241
if (t instanceof DisabledOidcClientException) {
43-
LOG.debug("Client is disabled");
44-
requestContext.abortWith(Response.status(Response.Status.INTERNAL_SERVER_ERROR).build());
42+
LOG.debug("Client is disabled, aborting the request");
4543
} else {
46-
LOG.debugf("Access token is not available, aborting the request with HTTP 401 error: %s", t.getMessage());
47-
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
44+
LOG.debugf("Access token is not available, cause: %s, aborting the request", t.getMessage());
4845
}
49-
requestContext.resume();
46+
requestContext.resume((t instanceof RuntimeException) ? t : new RuntimeException(t));
5047
}
5148
});
5249
}

integration-tests/oidc-client-reactive/src/main/java/io/quarkus/it/keycloak/FrontendResource.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.quarkus.it.keycloak;
22

3+
import java.util.function.Function;
4+
35
import jakarta.inject.Inject;
46
import jakarta.ws.rs.GET;
57
import jakarta.ws.rs.Path;
@@ -23,6 +25,10 @@ public class FrontendResource {
2325
@RestClient
2426
ProtectedResourceServiceNamedFilter protectedResourceServiceNamedFilter;
2527

28+
@Inject
29+
@RestClient
30+
MisconfiguredClientFilter misconfiguredClientFilter;
31+
2632
@GET
2733
@Path("userNameCustomFilter")
2834
@Produces("text/plain")
@@ -43,4 +49,19 @@ public Uni<String> userNameReactive() {
4349
public Uni<String> userNameNamedFilter() {
4450
return protectedResourceServiceNamedFilter.getUserName();
4551
}
52+
53+
@GET
54+
@Path("userNameMisconfiguredClientFilter")
55+
@Produces("text/plain")
56+
public Uni<String> userNameMisconfiguredClientFilter() {
57+
return misconfiguredClientFilter.getUserName().onFailure(Throwable.class)
58+
.recoverWithItem(new Function<Throwable, String>() {
59+
60+
@Override
61+
public String apply(Throwable t) {
62+
return t.getMessage();
63+
}
64+
65+
});
66+
}
4667
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.quarkus.it.keycloak;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
import jakarta.ws.rs.Produces;
6+
7+
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
8+
9+
import io.quarkus.oidc.client.filter.OidcClientFilter;
10+
import io.smallrye.mutiny.Uni;
11+
12+
@RegisterRestClient
13+
@OidcClientFilter("misconfigured-client")
14+
@Path("/")
15+
public interface MisconfiguredClientFilter {
16+
17+
@GET
18+
@Produces("text/plain")
19+
@Path("userNameReactive")
20+
Uni<String> getUserName();
21+
}

integration-tests/oidc-client-reactive/src/main/resources/application.properties

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,17 @@ quarkus.oidc-client.named-client.grant.type=password
1717
quarkus.oidc-client.named-client.grant-options.password.username=jdoe
1818
quarkus.oidc-client.named-client.grant-options.password.password=jdoe
1919

20+
quarkus.oidc-client.misconfigured-client.auth-server-url=${quarkus.oidc.auth-server-url}
21+
quarkus.oidc-client.misconfigured-client.client-id=${quarkus.oidc.client-id}
22+
quarkus.oidc-client.misconfigured-client.credentials.secret=${quarkus.oidc.credentials.secret}
23+
quarkus.oidc-client.misconfigured-client.grant.type=password
24+
quarkus.oidc-client.misconfigured-client.grant-options.password.username=jdoe
25+
quarkus.oidc-client.misconfigured-client.grant-options.password.password=bob
26+
2027
io.quarkus.it.keycloak.ProtectedResourceServiceCustomFilter/mp-rest/url=http://localhost:8081/protected
2128
io.quarkus.it.keycloak.ProtectedResourceServiceReactiveFilter/mp-rest/url=http://localhost:8081/protected
2229
io.quarkus.it.keycloak.ProtectedResourceServiceNamedFilter/mp-rest/url=http://localhost:8081/protected
30+
io.quarkus.it.keycloak.MisconfiguredClientFilter/mp-rest/url=http://localhost:8081/protected
2331

2432
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".min-level=TRACE
2533
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".level=TRACE

integration-tests/oidc-client-reactive/src/test/java/io/quarkus/it/keycloak/OidcClientTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.awaitility.Awaitility.await;
44
import static org.awaitility.Awaitility.given;
5+
import static org.hamcrest.Matchers.containsString;
56
import static org.hamcrest.Matchers.equalTo;
67
import static org.junit.jupiter.api.Assertions.assertEquals;
78

@@ -44,6 +45,15 @@ public void testGetUserNameNamedFilter() {
4445
.body(equalTo("jdoe"));
4546
}
4647

48+
@Test
49+
public void testGetUserNameMisconfiguredClientFilter() {
50+
RestAssured.given().header("Accept", "text/plain")
51+
.when().get("/frontend/userNameMisconfiguredClientFilter")
52+
.then()
53+
.statusCode(200)
54+
.body(containsString("invalid_grant"));
55+
}
56+
4757
@Test
4858
public void testGetUserNameReactive() {
4959
RestAssured.given().header("Accept", "text/plain")

integration-tests/oidc-client/src/main/java/io/quarkus/it/keycloak/FrontendResource.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import jakarta.inject.Inject;
44
import jakarta.ws.rs.GET;
55
import jakarta.ws.rs.Path;
6+
import jakarta.ws.rs.Produces;
67

78
import org.eclipse.microprofile.context.ManagedExecutor;
89
import org.eclipse.microprofile.rest.client.inject.RestClient;
@@ -29,6 +30,10 @@ public class FrontendResource {
2930
@RestClient
3031
ProtectedResourceServiceNonDefaultOidcClient protectedResourceServiceNonDefaultOidcClient;
3132

33+
@Inject
34+
@RestClient
35+
MisconfiguredClientFilter misconfiguredClientFilter;
36+
3237
@Inject
3338
ManagedExecutor managedExecutor;
3439

@@ -47,6 +52,17 @@ public String userNameNonDefaultOidcClient() {
4752
return protectedResourceServiceNonDefaultOidcClient.getUserName();
4853
}
4954

55+
@GET
56+
@Path("userNameMisconfiguredClientFilter")
57+
@Produces("text/plain")
58+
public String userNameMisconfiguredClientFilter() {
59+
try {
60+
return misconfiguredClientFilter.getUserName();
61+
} catch (Throwable t) {
62+
return t.getMessage();
63+
}
64+
}
65+
5066
@GET
5167
@Path("userOidcClientManagedExecutor")
5268
public String userNameOidcClientManagedExecutor() throws Exception {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.quarkus.it.keycloak;
2+
3+
import jakarta.ws.rs.GET;
4+
import jakarta.ws.rs.Path;
5+
6+
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
7+
8+
import io.quarkus.oidc.client.filter.OidcClientFilter;
9+
10+
@RegisterRestClient
11+
@OidcClientFilter("misconfigured-client")
12+
@Path("/")
13+
public interface MisconfiguredClientFilter {
14+
15+
@GET
16+
String getUserName();
17+
}

integration-tests/oidc-client/src/main/resources/application.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ quarkus.oidc-client.named.grant.type=password
1616
quarkus.oidc-client.named.grant-options.password.username=alice
1717
quarkus.oidc-client.named.grant-options.password.password=alice
1818

19+
quarkus.oidc-client.misconfigured-client.auth-server-url=${quarkus.oidc.auth-server-url}
20+
quarkus.oidc-client.misconfigured-client.client-id=${quarkus.oidc.client-id}
21+
quarkus.oidc-client.misconfigured-client.credentials.secret=${quarkus.oidc.credentials.secret}
22+
quarkus.oidc-client.misconfigured-client.grant.type=password
23+
quarkus.oidc-client.misconfigured-client.grant-options.password.username=jdoe
24+
quarkus.oidc-client.misconfigured-client.grant-options.password.password=bob
25+
quarkus.oidc-client.misconfigured-client.early-tokens-acquisition=false
26+
1927
quarkus.oidc-client.non-default-client.auth-server-url=${quarkus.oidc.auth-server-url}
2028
quarkus.oidc-client.non-default-client.client-id=${quarkus.oidc.client-id}
2129
quarkus.oidc-client.non-default-client.credentials.secret=${quarkus.oidc.credentials.secret}
@@ -28,6 +36,7 @@ io.quarkus.it.keycloak.ProtectedResourceServiceOidcClient/mp-rest/url=http://loc
2836
io.quarkus.it.keycloak.ProtectedResourceServiceNamedOidcClient/mp-rest/url=http://localhost:8081/protected
2937
io.quarkus.it.keycloak.ProtectedResourceServiceNoOidcClient/mp-rest/url=http://localhost:8081/protected
3038
io.quarkus.it.keycloak.ProtectedResourceServiceNonDefaultOidcClient/mp-rest/url=http://localhost:8081/protected
39+
io.quarkus.it.keycloak.MisconfiguredClientFilter/mp-rest/url=http://localhost:8081/protected
3140

3241
quarkus.tls.trust-all=true
3342
quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientImpl".min-level=TRACE

integration-tests/oidc-client/src/test/java/io/quarkus/it/keycloak/OidcClientTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.awaitility.Awaitility.await;
44
import static org.awaitility.Awaitility.given;
5+
import static org.hamcrest.Matchers.containsString;
56
import static org.hamcrest.Matchers.equalTo;
67
import static org.junit.jupiter.api.Assertions.assertEquals;
78

@@ -36,6 +37,15 @@ public void testGetUserNameOidcClient() {
3637
.body(equalTo("alice"));
3738
}
3839

40+
@Test
41+
public void testGetUserNameMisconfiguredClientFilter() {
42+
RestAssured.given().header("Accept", "text/plain")
43+
.when().get("/frontend/userNameMisconfiguredClientFilter")
44+
.then()
45+
.statusCode(200)
46+
.body(containsString("invalid_grant"));
47+
}
48+
3949
@Test
4050
public void testGetUserNameNonDefaultOidcClient() {
4151
RestAssured.when().get("/frontend/userNonDefaultOidcClient")

0 commit comments

Comments
 (0)