Skip to content

Commit 92b67ae

Browse files
committed
Fix error when Bearer token is requested with empty string
Issue gh-15885
1 parent 562ba01 commit 92b67ae

File tree

4 files changed

+59
-0
lines changed

4 files changed

+59
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ public String resolve(final HttpServletRequest request) {
6464
return authorizationHeaderToken;
6565
}
6666
if (parameterToken != null && isParameterTokenEnabledForRequest(request)) {
67+
if (!StringUtils.hasText(parameterToken)) {
68+
final BearerTokenError error = BearerTokenErrors
69+
.invalidRequest("The requested token parameter is an empty string");
70+
throw new OAuth2AuthenticationException(error);
71+
}
6772
return parameterToken;
6873
}
6974
return null;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ private String token(ServerHttpRequest request) {
7878
return authorizationHeaderToken;
7979
}
8080
if (parameterToken != null && isParameterTokenSupportedForRequest(request)) {
81+
if (!StringUtils.hasText(parameterToken)) {
82+
final BearerTokenError error = BearerTokenErrors
83+
.invalidRequest("The requested token parameter is an empty string");
84+
throw new OAuth2AuthenticationException(error);
85+
}
8186
return parameterToken;
8287
}
8388
return null;

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@
2121
import org.junit.jupiter.api.BeforeEach;
2222
import org.junit.jupiter.api.Test;
2323

24+
import org.springframework.http.HttpStatus;
2425
import org.springframework.mock.web.MockHttpServletRequest;
2526
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
27+
import org.springframework.security.oauth2.server.resource.BearerTokenError;
28+
import org.springframework.security.oauth2.server.resource.BearerTokenErrorCodes;
2629

2730
import static org.assertj.core.api.Assertions.assertThat;
2831
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -258,4 +261,36 @@ public void resolveWhenQueryParameterIsPresentAndNotSupportedThenTokenIsNotResol
258261
assertThat(this.resolver.resolve(request)).isNull();
259262
}
260263

264+
@Test
265+
public void resolveWhenQueryParameterIsPresentAndEmptyStringThenTokenIsNotResolved() {
266+
this.resolver.setAllowUriQueryParameter(true);
267+
MockHttpServletRequest request = new MockHttpServletRequest();
268+
request.setMethod("GET");
269+
request.setQueryString("access_token=");
270+
request.addParameter("access_token", "");
271+
assertThatExceptionOfType(OAuth2AuthenticationException.class).isThrownBy(() -> this.resolver.resolve(request))
272+
.withMessageContaining("The requested token parameter is an empty string")
273+
.satisfies(e -> {
274+
BearerTokenError error = (BearerTokenError) e.getError();
275+
assertThat(error.getErrorCode()).isEqualTo(BearerTokenErrorCodes.INVALID_REQUEST);
276+
assertThat(error.getHttpStatus()).isEqualTo(HttpStatus.BAD_REQUEST);
277+
});
278+
}
279+
280+
@Test
281+
public void resolveWhenFormParameterIsPresentAndEmptyStringThenTokenIsNotResolved() {
282+
this.resolver.setAllowFormEncodedBodyParameter(true);
283+
MockHttpServletRequest request = new MockHttpServletRequest();
284+
request.setMethod("POST");
285+
request.setContentType("application/x-www-form-urlencoded");
286+
request.addParameter("access_token", "");
287+
assertThatExceptionOfType(OAuth2AuthenticationException.class).isThrownBy(() -> this.resolver.resolve(request))
288+
.withMessageContaining("The requested token parameter is an empty string")
289+
.satisfies(e -> {
290+
BearerTokenError error = (BearerTokenError) e.getError();
291+
assertThat(error.getErrorCode()).isEqualTo(BearerTokenErrorCodes.INVALID_REQUEST);
292+
assertThat(error.getHttpStatus()).isEqualTo(HttpStatus.BAD_REQUEST);
293+
});
294+
}
295+
261296
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,20 @@ void resolveWhenQueryParameterHasMultipleAccessTokensThenOAuth2AuthenticationExc
217217

218218
}
219219

220+
@Test
221+
public void resolveWhenQueryParameterIsPresentAndEmptyStringThenTokenIsNotResolved() {
222+
this.converter.setAllowUriQueryParameter(true);
223+
MockServerHttpRequest.BaseBuilder<?> request = MockServerHttpRequest.get("/")
224+
.queryParam("access_token", "");
225+
assertThatExceptionOfType(OAuth2AuthenticationException.class).isThrownBy(() -> convertToToken(request))
226+
.withMessageContaining("The requested token parameter is an empty string")
227+
.satisfies(e -> {
228+
BearerTokenError error = (BearerTokenError) e.getError();
229+
assertThat(error.getErrorCode()).isEqualTo(BearerTokenErrorCodes.INVALID_REQUEST);
230+
assertThat(error.getHttpStatus()).isEqualTo(HttpStatus.BAD_REQUEST);
231+
});
232+
}
233+
220234
private BearerTokenAuthenticationToken convertToToken(MockServerHttpRequest.BaseBuilder<?> request) {
221235
return convertToToken(request.build());
222236
}

0 commit comments

Comments
 (0)