Skip to content

Commit c59377e

Browse files
authored
Merge pull request #45628 from michalvavrik/feature/use-oidctestclient-with-dev-svc-for-oidc
OIDC: document and use OidcTestClient to get access token from Dev Services for OIDC
2 parents beee3db + e227b9c commit c59377e

File tree

7 files changed

+64
-35
lines changed

7 files changed

+64
-35
lines changed

docs/src/main/asciidoc/security-oidc-bearer-token-authentication.adoc

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,48 @@ For a test like this to work, the test `Auth0` application must have the `passwo
857857
This example code also shows how to pass additional parameters.
858858
For `Auth0`, these are the `audience` and `scope` parameters.
859859

860+
===== Test OIDC DevService
861+
862+
You can also use `OidcTestClient` to test Quarkus endpoints supported by xref:security-openid-connect-dev-services.adoc#dev-services-for-oidc[Dev Services for OIDC].
863+
No configuration in the `application.properties` file is needed, Quarkus will configure `OidcTestClient` for you:
864+
865+
[source, java]
866+
----
867+
package org.acme;
868+
869+
import static io.restassured.RestAssured.given;
870+
import static org.hamcrest.CoreMatchers.is;
871+
872+
import org.junit.jupiter.api.AfterAll;
873+
import org.junit.jupiter.api.Test;
874+
875+
import io.quarkus.test.junit.QuarkusTest;
876+
import io.quarkus.test.oidc.client.OidcTestClient;
877+
878+
@QuarkusTest
879+
public class GreetingResourceTest {
880+
881+
static final OidcTestClient oidcTestClient = new OidcTestClient();
882+
883+
@AfterAll
884+
public static void close() {
885+
oidcTestClient.close();
886+
}
887+
888+
@Test
889+
public void testHelloEndpoint() {
890+
String accessToken = oidcTestClient.getAccessToken("alice", "alice");
891+
given()
892+
.auth().oauth2(accessToken)
893+
.when().get("/hello")
894+
.then()
895+
.statusCode(200)
896+
.body(is("Hello, Alice"));
897+
}
898+
899+
}
900+
----
901+
860902
ifndef::no-deprecated-test-resource[]
861903
[[bearer-token-integration-testing-keycloak]]
862904
==== `KeycloakTestResourceLifecycleManager`

docs/src/main/asciidoc/security-openid-connect-dev-services.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ This document refers to the `http://localhost:8080/q/dev-ui` Dev UI URL in sever
380380
If you customize `quarkus.http.root-path` or `quarkus.http.non-application-root-path` properties, then replace `q` accordingly.
381381
For more information, see the https://quarkus.io/blog/path-resolution-in-quarkus/[Path resolution in Quarkus] blog post.
382382

383+
[[dev-services-for-oidc]]
383384
== Dev Services for OIDC
384385

385386
When you work with Keycloak in production, <<dev-services-for-keycloak>> provides the best dev mode experience.

extensions/devservices/oidc/src/main/java/io/quarkus/devservices/oidc/OidcDevServicesConfig.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ public interface OidcDevServicesConfig {
2525
/**
2626
* A map of roles for OIDC identity provider users.
2727
* <p>
28-
* If empty, default roles are assigned: `alice` receives `admin` and `user` roles, while other users receive
29-
* `user` role.
30-
* This map is used for role creation when no realm file is found at the `realm-path`.
28+
* If empty, default roles are assigned: user `alice` receives `admin` and `user` roles and user `bob` receives role `user`.
3129
*/
3230
@ConfigDocMapKey("role-name")
3331
Map<String, List<String>> roles();

extensions/devservices/oidc/src/main/java/io/quarkus/devservices/oidc/OidcDevServicesProcessor.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,6 @@ private static void registerRoutes(Router router) {
192192
router.get("/logout").handler(OidcDevServicesProcessor::logout);
193193
router.get("/userinfo").handler(OidcDevServicesProcessor::userInfo);
194194

195-
// can be used for testing of bearer token authentication
196-
router.get("/testing/generate/access-token").handler(OidcDevServicesProcessor::generateAccessToken);
197-
198195
KeyPairGenerator kpg;
199196
try {
200197
kpg = KeyPairGenerator.getInstance("RSA");
@@ -206,22 +203,6 @@ private static void registerRoutes(Router router) {
206203
kid = createKeyId();
207204
}
208205

209-
private static void generateAccessToken(RoutingContext rc) {
210-
String user = rc.request().getParam("user");
211-
if (user == null || user.isEmpty()) {
212-
rc.response().setStatusCode(400).endAndForget("Missing required parameter: user");
213-
return;
214-
}
215-
String rolesParam = rc.request().getParam("roles");
216-
Set<String> roles = new HashSet<>();
217-
if (rolesParam == null || rolesParam.isEmpty()) {
218-
roles.addAll(getUserRoles(user));
219-
} else {
220-
roles.addAll(Arrays.asList(rolesParam.split(",")));
221-
}
222-
rc.response().endAndForget(createAccessToken(user, roles, Set.of("openid", "email")));
223-
}
224-
225206
private static List<String> getUsers() {
226207
if (userToDefaultRoles.isEmpty()) {
227208
return Arrays.asList("alice", "bob");

integration-tests/oidc-dev-services/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@
4444
</exclusion>
4545
</exclusions>
4646
</dependency>
47+
<dependency>
48+
<groupId>io.quarkus</groupId>
49+
<artifactId>quarkus-test-oidc-server</artifactId>
50+
<scope>test</scope>
51+
</dependency>
4752
<!-- Minimal test dependencies to *-deployment artifacts for consistent build order -->
4853
<dependency>
4954
<groupId>io.quarkus</groupId>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
quarkus.oidc.devservices.enabled=true
2+
quarkus.oidc.devservices.roles.Ronald=admin
23

4+
%code-flow.quarkus.oidc.devservices.roles.alice=admin,user
5+
%code-flow.quarkus.oidc.devservices.roles.bob=user
36
%code-flow.quarkus.oidc.application-type=web-app

integration-tests/oidc-dev-services/src/test/java/io/quarkus/it/oidc/dev/services/BearerAuthenticationOidcDevServicesTest.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
11
package io.quarkus.it.oidc.dev.services;
22

33
import org.hamcrest.Matchers;
4+
import org.junit.jupiter.api.AfterAll;
45
import org.junit.jupiter.api.Test;
56

67
import io.quarkus.test.junit.QuarkusTest;
8+
import io.quarkus.test.oidc.client.OidcTestClient;
79
import io.restassured.RestAssured;
810

911
@QuarkusTest
1012
public class BearerAuthenticationOidcDevServicesTest {
1113

14+
static final OidcTestClient oidcTestClient = new OidcTestClient();
15+
16+
@AfterAll
17+
public static void close() {
18+
oidcTestClient.close();
19+
}
20+
1221
@Test
1322
public void testLoginAsCustomUser() {
1423
RestAssured.given()
15-
.auth().oauth2(getAccessToken("Ronald", "admin"))
24+
.auth().oauth2(getAccessToken("Ronald"))
1625
.get("/secured/admin-only")
1726
.then()
1827
.statusCode(200)
1928
.body(Matchers.containsString("Ronald"))
2029
.body(Matchers.containsString("admin"));
2130
RestAssured.given()
22-
.auth().oauth2(getAccessToken("Ronald", "admin"))
31+
.auth().oauth2(getAccessToken("Ronald"))
2332
.get("/secured/user-only")
2433
.then()
2534
.statusCode(403);
@@ -62,16 +71,6 @@ public void testLoginAsBob() {
6271
}
6372

6473
private String getAccessToken(String user) {
65-
return RestAssured.given().get(getAuthServerUrl() + "/testing/generate/access-token?user=" + user).asString();
66-
}
67-
68-
private String getAccessToken(String user, String... roles) {
69-
return RestAssured.given()
70-
.get(getAuthServerUrl() + "/testing/generate/access-token?user=" + user + "&roles=" + String.join(",", roles))
71-
.asString();
72-
}
73-
74-
private static String getAuthServerUrl() {
75-
return RestAssured.get("/secured/auth-server-url").then().statusCode(200).extract().body().asString();
74+
return oidcTestClient.getAccessToken(user, user);
7675
}
7776
}

0 commit comments

Comments
 (0)