Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Function;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
Expand Down Expand Up @@ -51,6 +52,8 @@ public final class BearerTokenAuthenticationEntryPoint implements Authentication

private String realmName;

private Function<HttpServletRequest, String> resourceMetadataParameterResolver = BearerTokenAuthenticationEntryPoint::getResourceMetadataParameter;

/**
* Collect error details from the provided parameters and format according to RFC
* 6750, specifically {@code error}, {@code error_description}, {@code error_uri}, and
Expand Down Expand Up @@ -83,7 +86,7 @@ public void commence(HttpServletRequest request, HttpServletResponse response,
status = bearerTokenError.getHttpStatus();
}
}
parameters.put("resource_metadata", getResourceMetadataParameter(request));
parameters.put("resource_metadata", this.resourceMetadataParameterResolver.apply(request));
String wwwAuthenticate = computeWWWAuthenticateHeaderValue(parameters);
response.addHeader(HttpHeaders.WWW_AUTHENTICATE, wwwAuthenticate);
response.setStatus(status.value());
Expand All @@ -97,6 +100,16 @@ public void setRealmName(String realmName) {
this.realmName = realmName;
}

/**
* Set the resolver to compute the {@code resource_metadata} parameter from the
* request.
* @param resourceMetadataParameterResolver
*/
public void setResourceMetadataParameterResolver(
Function<HttpServletRequest, String> resourceMetadataParameterResolver) {
this.resourceMetadataParameterResolver = resourceMetadataParameterResolver;
}

private static String getResourceMetadataParameter(HttpServletRequest request) {
String path = request.getContextPath()
+ OAuth2ProtectedResourceMetadataFilter.DEFAULT_OAUTH2_PROTECTED_RESOURCE_METADATA_ENDPOINT_URI;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,19 @@ public void commenceWhenNoBearerTokenErrorAndContextPathSetThenStatus401AndAuthH

}

@Test
public void commenceWhenNoBearerTokenErrorAndResourceMetadataResolverSetThenStatus401AndAuthHeaderWithResolvedResourceMetadata() {
MockHttpServletRequest request = new MockHttpServletRequest();
request.setAttribute("resource_id", "https://example.com/resource-from-request");
MockHttpServletResponse response = new MockHttpServletResponse();
this.authenticationEntryPoint
.setResourceMetadataParameterResolver((req) -> req.getAttribute("resource_id").toString());
this.authenticationEntryPoint.commence(request, response, new BadCredentialsException("test"));
assertThat(response.getStatus()).isEqualTo(401);
assertThat(response.getHeader("WWW-Authenticate"))
.isEqualTo("Bearer resource_metadata=\"https://example.com/resource-from-request\"");
}

@Test
public void commenceWhenInvalidRequestErrorThenStatus400AndHeaderWithError() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
Expand Down
Loading