Skip to content

Commit ba8a337

Browse files
committed
Accept a case-insensitive "Bearer" keyword
The Authorization header was matched for OAuth2 against the "Bearer" keyword in a case sensitive fashion. According to RFC 2617, it should be case insensitive and some oauth clients (including some earlier versions of spring-security) expect it so. This is the reactive counterpart to commit 63f2b60 . Fixes gh-6195
1 parent 60fc538 commit ba8a337

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@
4343
*/
4444
public class ServerBearerTokenAuthenticationConverter
4545
implements ServerAuthenticationConverter {
46-
private static final Pattern authorizationPattern = Pattern.compile("^Bearer (?<token>[a-zA-Z0-9-._~+/]+)=*$");
46+
private static final Pattern authorizationPattern = Pattern.compile(
47+
"^Bearer (?<token>[a-zA-Z0-9-._~+/]+)=*$",
48+
Pattern.CASE_INSENSITIVE);
4749

4850
private boolean allowUriQueryParameter = false;
4951

@@ -85,7 +87,7 @@ public void setAllowUriQueryParameter(boolean allowUriQueryParameter) {
8587

8688
private static String resolveFromAuthorizationHeader(HttpHeaders headers) {
8789
String authorization = headers.getFirst(HttpHeaders.AUTHORIZATION);
88-
if (StringUtils.hasText(authorization) && authorization.startsWith("Bearer")) {
90+
if (StringUtils.startsWithIgnoreCase(authorization, "bearer")) {
8991
Matcher matcher = authorizationPattern.matcher(authorization);
9092

9193
if ( !matcher.matches() ) {

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

+9
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ public void resolveWhenValidHeaderIsPresentThenTokenIsResolved() {
5252
assertThat(convertToToken(request).getToken()).isEqualTo(TEST_TOKEN);
5353
}
5454

55+
@Test
56+
public void resolveWhenLowercaseHeaderIsPresentThenTokenIsResolved() {
57+
MockServerHttpRequest.BaseBuilder<?> request = MockServerHttpRequest
58+
.get("/")
59+
.header(HttpHeaders.AUTHORIZATION, "bearer " + TEST_TOKEN);
60+
61+
assertThat(convertToToken(request).getToken()).isEqualTo(TEST_TOKEN);
62+
}
63+
5564
@Test
5665
public void resolveWhenNoHeaderIsPresentThenTokenIsNotResolved() {
5766
MockServerHttpRequest.BaseBuilder<?> request = MockServerHttpRequest

0 commit comments

Comments
 (0)