Skip to content

Commit a709774

Browse files
committed
Sync documentation of main branch
1 parent aa1ea74 commit a709774

File tree

4 files changed

+203
-5
lines changed

4 files changed

+203
-5
lines changed

_versions/main/guides/security-oidc-code-flow-authentication.adoc

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ quarkus.oidc.introspection-credentials.secret=introspection-user-secret
336336
[[code-flow-oidc-request-filters]]
337337
=== OIDC request filters
338338

339-
You can filter OIDC requests made by Quarkus to the OIDC provider by registering one or more `OidcRequestFilter` implementations, which can update or add new request headers and can also log requests.
339+
You can filter OIDC requests made by Quarkus to the OIDC provider by registering one or more `OidcRequestFilter` implementations, which can update or add new request headers, customize a request body and can also log requests.
340340

341341
For example:
342342

@@ -401,6 +401,35 @@ public class OidcDiscoveryRequestCustomizer implements OidcRequestFilter {
401401
Currently, you can use a `tenand_id` key to access the OIDC tenant id and a `grant_type` key to access the grant type which the OIDC provider uses to acquire tokens.
402402
The `grant_type` can only be set to either `authorization_code` or `refresh_token` grant type, when requests are made to the token endpoint. It is `null` in all other cases.
403403

404+
`OidcRequestFilter` can customize a request body by preparing an instance of `io.vertx.mutiny.core.buffer.Buffer`
405+
and setting it on a request context, for example:
406+
407+
[source,java]
408+
----
409+
package io.quarkus.it.keycloak;
410+
411+
import jakarta.enterprise.context.ApplicationScoped;
412+
413+
import io.quarkus.arc.Unremovable;
414+
import io.quarkus.oidc.common.OidcEndpoint;
415+
import io.quarkus.oidc.common.OidcEndpoint.Type;
416+
import io.quarkus.oidc.common.OidcRequestContextProperties;
417+
import io.quarkus.oidc.common.OidcRequestFilter;
418+
import io.vertx.mutiny.core.buffer.Buffer;
419+
420+
@ApplicationScoped
421+
@Unremovable
422+
@OidcEndpoint(value = Type.TOKEN)
423+
public class TokenRequestFilter implements OidcRequestFilter {
424+
425+
@Override
426+
public void filter(OidcRequestContext rc) {
427+
// Add more required properties to the token request
428+
rc.requestBody(Buffer.buffer(rc.requestBody().toString() + "&opaque_token_param=opaque_token_value"));
429+
}
430+
}
431+
----
432+
404433
[[code-flow-oidc-response-filters]]
405434
=== OIDC response filters
406435

@@ -445,6 +474,40 @@ public class TokenEndpointResponseFilter implements OidcResponseFilter {
445474
<3> Use `OidcRequestContextProperties` request properties to check only an `authorization_code` token grant response for the `code-flow-user-info-cached-in-idtoken` tenant.
446475
<4> Confirm the response JSON contains an `id_token` property.
447476

477+
`OidcResponseFilter` can customize a response body by preparing an instance of `io.vertx.mutiny.core.buffer.Buffer`
478+
and setting it on a response context, for example:
479+
480+
[source,java]
481+
----
482+
package io.quarkus.it.keycloak;
483+
484+
import jakarta.enterprise.context.ApplicationScoped;
485+
486+
import io.quarkus.arc.Unremovable;
487+
import io.quarkus.oidc.common.OidcEndpoint;
488+
import io.quarkus.oidc.common.OidcEndpoint.Type;
489+
import io.quarkus.oidc.common.OidcRequestContextProperties;
490+
import io.quarkus.oidc.common.OidcResponseFilter;
491+
import io.vertx.core.json.JsonObject;
492+
import io.vertx.mutiny.core.buffer.Buffer;
493+
494+
@ApplicationScoped
495+
@Unremovable
496+
@OidcEndpoint(value = Type.TOKEN)
497+
public class TokenResponseFilter implements OidcResponseFilter {
498+
499+
@Override
500+
public void filter(OidcResponseContext rc) {
501+
JsonObject body = rc.responseBody().toJsonObject();
502+
// JSON `scope` property has multiple values separated by a comma character.
503+
// It must be replaced with a space character.
504+
String scope = body.getString("scope");
505+
body.put("scope", scope.replace(",", " "));
506+
rc.responseBody(Buffer.buffer(body.toString()));
507+
}
508+
}
509+
----
510+
448511
=== Redirecting to and from the OIDC provider
449512

450513
When a user is redirected to the OIDC provider to authenticate, the redirect URL includes a `redirect_uri` query parameter, which indicates to the provider where the user has to be redirected to when the authentication is complete.

_versions/main/guides/security-oidc-expanded-configuration.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,13 +1235,13 @@ You can also intercept OIDC redirect requests.
12351235

12361236
==== OIDC requests
12371237

1238-
You can use OIDC request filters to observe requests, add additional headers, and set context properties for coordinating with OIDC response filters.
1238+
You can use OIDC request filters to observe requests, add additional headers, customize a request body, and set context properties for coordinating with OIDC response filters.
12391239

12401240
Use xref:security-oidc-code-flow-authentication.adoc#code-flow-oidc-request-filters[quarkus.oidc.common.OidcRequestFilter] to implement a request filter and if necessary, restrict it to the specific OIDC endpoint or endpoints only with the `quarkus.oidc.common.OidcEndpoint` annotation.
12411241

12421242
==== OIDC responses
12431243

1244-
You can use OIDC response filters to observe responses, and use the context properties for coordinating with OIDC request filters.
1244+
You can use OIDC response filters to observe responses, customize a response body, and use the context properties for coordinating with OIDC request filters.
12451245

12461246
Use xref:security-oidc-code-flow-authentication.adoc#code-flow-oidc-response-filters[quarkus.oidc.common.OidcResponseFilter] to implement a response filter and if necessary, restrict it to the specific OIDC endpoint or endpoints only with the `quarkus.oidc.common.OidcEndpoint` annotation.
12471247

_versions/main/guides/security-openid-connect-client-reference.adoc

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,7 @@ quarkus.log.category."io.quarkus.oidc.client.runtime.OidcClientRecorder".min-lev
12201220
[[oidc-client-ref-oidc-request-filters]]
12211221
== OIDC request filters
12221222

1223-
You can filter OIDC requests made by OIDC client to the OIDC provider by registering one or more `OidcRequestFilter` implementations, which can update or add new request headers, or analyze the request body.
1223+
You can filter OIDC requests made by OIDC client to the OIDC provider by registering one or more `OidcRequestFilter` implementations, which can update or add new request headers, customize or analyze the request body.
12241224

12251225
You can have a single filter intercepting requests to all OIDC provider endpoints, or use an `@OidcEndpoint` annotation to apply this filter to requests to specific endpoints only. For example:
12261226

@@ -1258,6 +1258,35 @@ public class OidcRequestCustomizer implements OidcRequestFilter {
12581258
`OidcRequestContextProperties` can be used to access request properties.
12591259
Currently, you can use a `client_id` key to access the client tenant id and a `grant_type` key to access the grant type which the OIDC client uses to acquire tokens.
12601260

1261+
`OidcRequestFilter` can customize a request body by preparing an instance of `io.vertx.mutiny.core.buffer.Buffer`
1262+
and setting it on a request context, for example:
1263+
1264+
[source,java]
1265+
----
1266+
package io.quarkus.it.keycloak;
1267+
1268+
import jakarta.enterprise.context.ApplicationScoped;
1269+
1270+
import io.quarkus.arc.Unremovable;
1271+
import io.quarkus.oidc.common.OidcEndpoint;
1272+
import io.quarkus.oidc.common.OidcEndpoint.Type;
1273+
import io.quarkus.oidc.common.OidcRequestContextProperties;
1274+
import io.quarkus.oidc.common.OidcRequestFilter;
1275+
import io.vertx.mutiny.core.buffer.Buffer;
1276+
1277+
@ApplicationScoped
1278+
@Unremovable
1279+
@OidcEndpoint(value = Type.TOKEN)
1280+
public class TokenRequestFilter implements OidcRequestFilter {
1281+
1282+
@Override
1283+
public void filter(OidcRequestContext rc) {
1284+
// Add more required properties to the token request
1285+
rc.requestBody(rc.requestBody().toString() + "&opaque_token_param=opaque_token_value"));
1286+
}
1287+
}
1288+
----
1289+
12611290
[[oidc-client-ref-oidc-response-filters]]
12621291
== OIDC response filters
12631292

@@ -1302,6 +1331,40 @@ public class TokenEndpointResponseFilter implements OidcResponseFilter {
13021331
<3> Use `OidcRequestContextProperties` request properties to confirm it is a `refresh_grant` token grant response.
13031332
<4> Confirm the response JSON contains a `refresh_token` property.
13041333

1334+
`OidcResponseFilter` can customize a response body by preparing an instance of `io.vertx.mutiny.core.buffer.Buffer`
1335+
and setting it as a property on a response context, for example:
1336+
1337+
[source,java]
1338+
----
1339+
package io.quarkus.it.keycloak;
1340+
1341+
import jakarta.enterprise.context.ApplicationScoped;
1342+
1343+
import io.quarkus.arc.Unremovable;
1344+
import io.quarkus.oidc.common.OidcEndpoint;
1345+
import io.quarkus.oidc.common.OidcEndpoint.Type;
1346+
import io.quarkus.oidc.common.OidcRequestContextProperties;
1347+
import io.quarkus.oidc.common.OidcResponseFilter;
1348+
import io.vertx.core.json.JsonObject;
1349+
import io.vertx.mutiny.core.buffer.Buffer;
1350+
1351+
@ApplicationScoped
1352+
@Unremovable
1353+
@OidcEndpoint(value = Type.TOKEN)
1354+
public class TokenResponseFilter implements OidcResponseFilter {
1355+
1356+
@Override
1357+
public void filter(OidcResponseContext rc) {
1358+
JsonObject body = rc.responseBody().toJsonObject();
1359+
// JSON `scope` property has multiple values separated by a comma character.
1360+
// It must be replaced with a space character.
1361+
String scope = body.getString("scope");
1362+
body.put("scope", scope.replace(",", " "));
1363+
rc.responseBody(Buffer.buffer(body.toString()));
1364+
}
1365+
}
1366+
----
1367+
13051368
[[token-propagation-rest]]
13061369
== Token Propagation for Quarkus REST
13071370

_versions/main/guides/security-openid-connect-client-registration.adoc

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,9 @@ You can persist the already registered client's registration URI and registratio
505505
[[oidc-client-registration-oidc-request-filters]]
506506
== OIDC request filters
507507

508-
You can filter OIDC client registration and registered client requests registering one or more `OidcRequestFilter` implementations, which can update or add new request headers. For example, a filter can analyze the request body and add its digest as a new header value:
508+
You can filter OIDC client registration and registered client requests registering one or more `OidcRequestFilter` implementations, which can update or add new request headers, as well as customize a request body.
509+
510+
For example, a filter can analyze the request body and add its digest as a new header value:
509511

510512
You can have a single filter intercepting all the OIDC registration and registered client requests, or use an `@OidcEndpoint` annotation to apply this filter to either OIDC registration or registered client endpoint responses only. For example:
511513

@@ -544,6 +546,40 @@ public class ClientRegistrationRequestFilter implements OidcRequestFilter {
544546
`OidcRequestContextProperties` can be used to access request properties.
545547
Currently, you can use a `client_id` key to access the client tenant id and a `grant_type` key to access the grant type which the OIDC client uses to acquire tokens.
546548

549+
`OidcRequestFilter` can customize a request body by preparing an instance of `io.vertx.mutiny.core.buffer.Buffer`
550+
and setting it on a request context, for example:
551+
552+
[source,java]
553+
----
554+
package io.quarkus.it.keycloak;
555+
556+
import jakarta.enterprise.context.ApplicationScoped;
557+
558+
import io.quarkus.arc.Unremovable;
559+
import io.quarkus.oidc.common.OidcEndpoint;
560+
import io.quarkus.oidc.common.OidcEndpoint.Type;
561+
import io.quarkus.oidc.common.OidcRequestContextProperties;
562+
import io.quarkus.oidc.common.OidcRequestFilter;
563+
import io.vertx.core.json.JsonObject;
564+
import io.vertx.mutiny.core.buffer.Buffer;
565+
566+
@ApplicationScoped
567+
@Unremovable
568+
@OidcEndpoint(value = Type.CLIENT_REGISTRATION)
569+
public class ClientRegistrationReRequestFilter implements OidcRequestFilter {
570+
571+
@Override
572+
public void filter(OidcRequestContext rc) {
573+
// Update the client name
574+
JsonObject body = rc.requestBody().toJsonObject();
575+
if ("Dynamic Tenant Client".equals(body.getString("client_name"))) {
576+
body.put("client_name", "Registered Dynamic Tenant Client");
577+
rc.requestBody(Buffer.buffer(body.toString()));
578+
}
579+
}
580+
}
581+
----
582+
547583
[[oidc-client-registration-oidc-response-filters]]
548584
== OIDC response filters
549585

@@ -625,6 +661,42 @@ public class RegisteredClientResponseFilter implements OidcResponseFilter {
625661
<2> Check the response `Content-Type` header.
626662
<3> Confirm the client name property was updated.
627663

664+
`OidcResponseFilter` can customize a response body by preparing an instance of `io.vertx.mutiny.core.buffer.Buffer`
665+
and setting it as a property on a response context, for example:
666+
667+
[source,java]
668+
----
669+
package io.quarkus.it.keycloak;
670+
671+
import jakarta.enterprise.context.ApplicationScoped;
672+
673+
import org.jboss.logging.Logger;
674+
675+
import io.quarkus.arc.Unremovable;
676+
import io.quarkus.oidc.common.OidcEndpoint;
677+
import io.quarkus.oidc.common.OidcEndpoint.Type;
678+
import io.quarkus.oidc.common.OidcRequestContextProperties;
679+
import io.quarkus.oidc.common.OidcResponseFilter;
680+
import io.vertx.core.json.JsonObject;
681+
import io.vertx.mutiny.core.buffer.Buffer;
682+
683+
@ApplicationScoped
684+
@Unremovable
685+
@OidcEndpoint(value = Type.CLIENT_REGISTRATION)
686+
public class ClientRegistrationResponseFilter implements OidcResponseFilter {
687+
688+
@Override
689+
public void filter(OidcResponseContext rc) {
690+
// Update the client name
691+
JsonObject body = rc.responseBody().toJsonObject();
692+
if ("Registered Dynamic Tenant Client".equals(body.getString("client_name"))) {
693+
body.put("client_name", "Registered Dynamically Tenant Client");
694+
rc.responseContext(Buffer.buffer(body.toString()));
695+
}
696+
}
697+
}
698+
----
699+
628700
[[configuration-reference]]
629701
== Configuration reference
630702

0 commit comments

Comments
 (0)