Skip to content

Commit 5458e08

Browse files
committed
request_uri used in PAR must be bound to the client
Issue gh-1925 Closes gh-1971
1 parent b87bf07 commit 5458e08

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/authentication/OAuth2AuthorizationCodeRequestAuthenticationProvider.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -356,9 +356,13 @@ private OAuth2AuthorizationCodeRequestAuthenticationToken fromPushedAuthorizatio
356356
OAuth2AuthorizationRequest authorizationRequest = authorization
357357
.getAttribute(OAuth2AuthorizationRequest.class.getName());
358358

359+
if (!authorizationCodeRequestAuthentication.getClientId().equals(authorizationRequest.getClientId())) {
360+
throwError(OAuth2ErrorCodes.INVALID_REQUEST, OAuth2ParameterNames.CLIENT_ID,
361+
authorizationCodeRequestAuthentication, null);
362+
}
363+
359364
return new OAuth2AuthorizationCodeRequestAuthenticationToken(
360-
authorizationCodeRequestAuthentication.getAuthorizationUri(),
361-
authorizationCodeRequestAuthentication.getClientId(),
365+
authorizationCodeRequestAuthentication.getAuthorizationUri(), authorizationRequest.getClientId(),
362366
(Authentication) authorizationCodeRequestAuthentication.getPrincipal(),
363367
authorizationRequest.getRedirectUri(), authorizationRequest.getState(),
364368
authorizationRequest.getScopes(), authorizationRequest.getAdditionalParameters());

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/authentication/OAuth2AuthorizationCodeRequestAuthenticationProviderTests.java

+30
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,36 @@ public void authenticateWhenAuthorizationCodeRequestWithInvalidRequestUriThenThr
660660
OAuth2ErrorCodes.INVALID_REQUEST, "request_uri", null));
661661
}
662662

663+
@Test
664+
public void authenticateWhenAuthorizationCodeRequestWithRequestUriIssuedToAnotherClientThenThrowOAuth2AuthorizationCodeRequestAuthenticationException() {
665+
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
666+
given(this.registeredClientRepository.findByClientId(eq(registeredClient.getClientId())))
667+
.willReturn(registeredClient);
668+
669+
RegisteredClient anotherRegisteredClient = TestRegisteredClients.registeredClient2().build();
670+
given(this.registeredClientRepository.findByClientId(eq(anotherRegisteredClient.getClientId())))
671+
.willReturn(anotherRegisteredClient);
672+
673+
OAuth2PushedAuthorizationRequestUri pushedAuthorizationRequestUri = OAuth2PushedAuthorizationRequestUri
674+
.create();
675+
Map<String, Object> additionalParameters = new HashMap<>();
676+
additionalParameters.put("request_uri", pushedAuthorizationRequestUri.getRequestUri());
677+
OAuth2Authorization authorization = TestOAuth2Authorizations
678+
.authorization(registeredClient, additionalParameters)
679+
.build();
680+
given(this.authorizationService.findByToken(eq(pushedAuthorizationRequestUri.getState()), eq(STATE_TOKEN_TYPE)))
681+
.willReturn(authorization);
682+
683+
OAuth2AuthorizationCodeRequestAuthenticationToken authentication = new OAuth2AuthorizationCodeRequestAuthenticationToken(
684+
AUTHORIZATION_URI, anotherRegisteredClient.getClientId(), this.principal, null, null, null,
685+
additionalParameters);
686+
687+
assertThatThrownBy(() -> this.authenticationProvider.authenticate(authentication))
688+
.isInstanceOf(OAuth2AuthorizationCodeRequestAuthenticationException.class)
689+
.satisfies((ex) -> assertAuthenticationException((OAuth2AuthorizationCodeRequestAuthenticationException) ex,
690+
OAuth2ErrorCodes.INVALID_REQUEST, "client_id", null));
691+
}
692+
663693
@Test
664694
public void authenticateWhenAuthorizationCodeNotGeneratedThenThrowOAuth2AuthorizationCodeRequestAuthenticationException() {
665695
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();

0 commit comments

Comments
 (0)