Skip to content

Commit 838b0b2

Browse files
committed
Add BearerTokenAuthenticationEntryPoint#setResourceMetadataParameterResolver
Signed-off-by: Daniel Garnier-Moiroux <git@garnier.wf>
1 parent ab3298e commit 838b0b2

2 files changed

Lines changed: 27 additions & 1 deletion

File tree

oauth2/oauth2-resource-server/src/main/java/org/springframework/security/oauth2/server/resource/web/BearerTokenAuthenticationEntryPoint.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.LinkedHashMap;
2020
import java.util.Map;
21+
import java.util.function.Function;
2122

2223
import jakarta.servlet.http.HttpServletRequest;
2324
import jakarta.servlet.http.HttpServletResponse;
@@ -51,6 +52,8 @@ public final class BearerTokenAuthenticationEntryPoint implements Authentication
5152

5253
private String realmName;
5354

55+
private Function<HttpServletRequest, String> resourceMetadataParameterResolver = BearerTokenAuthenticationEntryPoint::getResourceMetadataParameter;
56+
5457
/**
5558
* Collect error details from the provided parameters and format according to RFC
5659
* 6750, specifically {@code error}, {@code error_description}, {@code error_uri}, and
@@ -83,7 +86,7 @@ public void commence(HttpServletRequest request, HttpServletResponse response,
8386
status = bearerTokenError.getHttpStatus();
8487
}
8588
}
86-
parameters.put("resource_metadata", getResourceMetadataParameter(request));
89+
parameters.put("resource_metadata", this.resourceMetadataParameterResolver.apply(request));
8790
String wwwAuthenticate = computeWWWAuthenticateHeaderValue(parameters);
8891
response.addHeader(HttpHeaders.WWW_AUTHENTICATE, wwwAuthenticate);
8992
response.setStatus(status.value());
@@ -97,6 +100,16 @@ public void setRealmName(String realmName) {
97100
this.realmName = realmName;
98101
}
99102

103+
/**
104+
* Set the resolver to compute the {@code resource_metadata} parameter from the
105+
* request.
106+
* @param resourceMetadataParameterResolver
107+
*/
108+
public void setResourceMetadataParameterResolver(
109+
Function<HttpServletRequest, String> resourceMetadataParameterResolver) {
110+
this.resourceMetadataParameterResolver = resourceMetadataParameterResolver;
111+
}
112+
100113
private static String getResourceMetadataParameter(HttpServletRequest request) {
101114
String path = request.getContextPath()
102115
+ OAuth2ProtectedResourceMetadataFilter.DEFAULT_OAUTH2_PROTECTED_RESOURCE_METADATA_ENDPOINT_URI;

oauth2/oauth2-resource-server/src/test/java/org/springframework/security/oauth2/server/resource/web/BearerTokenAuthenticationEntryPointTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,19 @@ public void commenceWhenNoBearerTokenErrorAndContextPathSetThenStatus401AndAuthH
7777

7878
}
7979

80+
@Test
81+
public void commenceWhenNoBearerTokenErrorAndResourceMetadataResolverSetThenStatus401AndAuthHeaderWithResolvedResourceMetadata() {
82+
MockHttpServletRequest request = new MockHttpServletRequest();
83+
request.setAttribute("resource_id", "https://example.com/resource-from-request");
84+
MockHttpServletResponse response = new MockHttpServletResponse();
85+
this.authenticationEntryPoint
86+
.setResourceMetadataParameterResolver((req) -> req.getAttribute("resource_id").toString());
87+
this.authenticationEntryPoint.commence(request, response, new BadCredentialsException("test"));
88+
assertThat(response.getStatus()).isEqualTo(401);
89+
assertThat(response.getHeader("WWW-Authenticate"))
90+
.isEqualTo("Bearer resource_metadata=\"https://example.com/resource-from-request\"");
91+
}
92+
8093
@Test
8194
public void commenceWhenInvalidRequestErrorThenStatus400AndHeaderWithError() throws Exception {
8295
MockHttpServletRequest request = new MockHttpServletRequest();

0 commit comments

Comments
 (0)