Skip to content

Commit 63f2b60

Browse files
nlebasjzheaux
authored andcommitted
The "Bearer" keyword should be case-insensitive
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.
1 parent fdc8182 commit 63f2b60

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@
3636
*/
3737
public final class DefaultBearerTokenResolver implements BearerTokenResolver {
3838

39-
private static final Pattern authorizationPattern = Pattern.compile("^Bearer (?<token>[a-zA-Z0-9-._~+/]+)=*$");
39+
private static final Pattern authorizationPattern = Pattern.compile(
40+
"^Bearer (?<token>[a-zA-Z0-9-._~+/]+)=*$",
41+
Pattern.CASE_INSENSITIVE);
4042

4143
private boolean allowFormEncodedBodyParameter = false;
4244

@@ -87,7 +89,7 @@ public void setAllowUriQueryParameter(boolean allowUriQueryParameter) {
8789

8890
private static String resolveFromAuthorizationHeader(HttpServletRequest request) {
8991
String authorization = request.getHeader(HttpHeaders.AUTHORIZATION);
90-
if (StringUtils.hasText(authorization) && authorization.startsWith("Bearer")) {
92+
if (StringUtils.startsWithIgnoreCase(authorization, "bearer")) {
9193
Matcher matcher = authorizationPattern.matcher(authorization);
9294

9395
if (!matcher.matches()) {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ public void resolveWhenValidHeaderIsPresentThenTokenIsResolved() {
5151
assertThat(this.resolver.resolve(request)).isEqualTo(TEST_TOKEN);
5252
}
5353

54+
@Test
55+
public void resolveWhenLowercaseHeaderIsPresentThenTokenIsResolved() {
56+
MockHttpServletRequest request = new MockHttpServletRequest();
57+
request.addHeader("authorization", "bearer " + TEST_TOKEN);
58+
59+
assertThat(this.resolver.resolve(request)).isEqualTo(TEST_TOKEN);
60+
}
61+
5462
@Test
5563
public void resolveWhenNoHeaderIsPresentThenTokenIsNotResolved() {
5664
MockHttpServletRequest request = new MockHttpServletRequest();

0 commit comments

Comments
 (0)