Skip to content

Commit 8422ed3

Browse files
authored
Merge pull request #49662 from sberyozkin/oidc_protected_resource_metadata_www_authenticate
Set correct OAuth2 protected metadata challenge parameter
2 parents 90d55d2 + 370926a commit 8422ed3

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/ResourceMetadataHandler.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ private static void fireResourceMetadataEvent() {
184184

185185
static String resourceMetadataAuthenticateParameter(RoutingContext context, DefaultTenantConfigResolver resolver,
186186
OidcTenantConfig oidcConfig) {
187-
return " " + RESOURCE_METADATA_AUTHENTICATE_PARAM + "=\"" + buildResourceIdentifierUrl(context, resolver, oidcConfig)
187+
return " " + RESOURCE_METADATA_AUTHENTICATE_PARAM + "=\""
188+
+ buildAbsoluteResourceIdentifierUrl(context, resolver, oidcConfig)
188189
+ "\"";
189190
}
190191

@@ -208,6 +209,19 @@ static String buildResourceIdentifierUrl(RoutingContext context, DefaultTenantCo
208209
}
209210
}
210211

212+
static String buildAbsoluteResourceIdentifierUrl(RoutingContext context, DefaultTenantConfigResolver resolver,
213+
OidcTenantConfig oidcConfig) {
214+
String configuredResource = getResourceMetadataPath(oidcConfig, resolver.getRootPath());
215+
216+
if (configuredResource.startsWith(HTTP_SCHEME)) {
217+
return configuredResource;
218+
} else {
219+
String authority = URI.create(context.request().absoluteURI()).getAuthority();
220+
return buildUri(context, resolver.isEnableHttpForwardedPrefix(),
221+
oidcConfig.resourceMetadata().forceHttpsScheme(), authority, configuredResource);
222+
}
223+
}
224+
211225
private static String buildUri(RoutingContext context,
212226
boolean enableHttpForwardedPrefix, boolean forceHttps, String authority, String path) {
213227
final String scheme = forceHttps ? "https" : context.request().scheme();

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.junit.jupiter.api.RepeatedTest;
1111
import org.junit.jupiter.api.Test;
1212

13+
import io.quarkus.oidc.common.runtime.OidcConstants;
1314
import io.quarkus.test.keycloak.client.KeycloakTestClient;
1415
import io.quarkus.test.keycloak.client.KeycloakTestClient.Tls;
1516
import io.restassured.RestAssured;
@@ -149,7 +150,8 @@ public void testVerificationFailedInvalidToken() {
149150
RestAssured.given().auth().oauth2("123")
150151
.when().get("/api/users/me").then()
151152
.statusCode(401)
152-
.header("WWW-Authenticate", equalTo("Bearer resource_metadata=\"https://localhost:8081\""));
153+
.header("WWW-Authenticate", equalTo("Bearer resource_metadata=\"https://localhost:8081"
154+
+ OidcConstants.RESOURCE_METADATA_WELL_KNOWN_PATH + "\""));
153155
}
154156

155157
//see https://github.com/quarkusio/quarkus/issues/5809
@@ -187,7 +189,8 @@ public void testBasicAuthFailureWhereBearerIsRequired() {
187189
.when().get("/bearer-only")
188190
.then()
189191
.statusCode(401)
190-
.header("WWW-Authenticate", equalTo("Bearer resource_metadata=\"https://localhost:8081\""));
192+
.header("WWW-Authenticate", equalTo("Bearer resource_metadata=\"https://localhost:8081"
193+
+ OidcConstants.RESOURCE_METADATA_WELL_KNOWN_PATH + "\""));
191194
}
192195

193196
@Test

0 commit comments

Comments
 (0)