Skip to content

Commit 4957c5a

Browse files
Kehrlannjgrandja
authored andcommitted
Add BearerTokenAuthenticationEntryPoint#setResourceMetadataParameterResolver
Closes gh-18542 Signed-off-by: Daniel Garnier-Moiroux <git@garnier.wf>
1 parent 5b7c4ae commit 4957c5a

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

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

Lines changed: 16 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;
@@ -31,6 +32,7 @@
3132
import org.springframework.security.oauth2.server.resource.web.authentication.BearerTokenAuthenticationFilter;
3233
import org.springframework.security.web.AuthenticationEntryPoint;
3334
import org.springframework.security.web.util.UrlUtils;
35+
import org.springframework.util.Assert;
3436
import org.springframework.util.StringUtils;
3537
import org.springframework.web.util.UriComponentsBuilder;
3638

@@ -51,6 +53,8 @@ public final class BearerTokenAuthenticationEntryPoint implements Authentication
5153

5254
private String realmName;
5355

56+
private Function<HttpServletRequest, String> resourceMetadataParameterResolver = BearerTokenAuthenticationEntryPoint::getResourceMetadataParameter;
57+
5458
/**
5559
* Collect error details from the provided parameters and format according to RFC
5660
* 6750, specifically {@code error}, {@code error_description}, {@code error_uri}, and
@@ -83,7 +87,7 @@ public void commence(HttpServletRequest request, HttpServletResponse response,
8387
status = bearerTokenError.getHttpStatus();
8488
}
8589
}
86-
parameters.put("resource_metadata", getResourceMetadataParameter(request));
90+
parameters.put("resource_metadata", this.resourceMetadataParameterResolver.apply(request));
8791
String wwwAuthenticate = computeWWWAuthenticateHeaderValue(parameters);
8892
response.addHeader(HttpHeaders.WWW_AUTHENTICATE, wwwAuthenticate);
8993
response.setStatus(status.value());
@@ -97,6 +101,17 @@ public void setRealmName(String realmName) {
97101
this.realmName = realmName;
98102
}
99103

104+
/**
105+
* Set the resolver to compute the {@code resource_metadata} parameter from the
106+
* request.
107+
* @param resourceMetadataParameterResolver
108+
*/
109+
public void setResourceMetadataParameterResolver(
110+
Function<HttpServletRequest, String> resourceMetadataParameterResolver) {
111+
Assert.notNull(resourceMetadataParameterResolver, "resourceMetadataParameterResolver cannot be null");
112+
this.resourceMetadataParameterResolver = resourceMetadataParameterResolver;
113+
}
114+
100115
private static String getResourceMetadataParameter(HttpServletRequest request) {
101116
String path = request.getContextPath()
102117
+ 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)