|
@@ -52,23 +52,77 @@ public final class DefaultBearerTokenResolver implements BearerTokenResolver {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public String resolve(final HttpServletRequest request) {
|
|
public String resolve(final HttpServletRequest request) {
|
|
- final String authorizationHeaderToken = resolveFromAuthorizationHeader(request);
|
|
|
|
- final String parameterToken = resolveFromRequestParameters(request);
|
|
|
|
|
|
+ // @formatter:off
|
|
|
|
+ return resolveToken(
|
|
|
|
+ resolveFromAuthorizationHeader(request),
|
|
|
|
+ resolveAccessTokenFromQueryString(request),
|
|
|
|
+ resolveAccessTokenFromBody(request)
|
|
|
|
+ );
|
|
|
|
+ // @formatter:on
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static String resolveToken(String... accessTokens) {
|
|
|
|
+ if (accessTokens == null || accessTokens.length == 0) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
|
|
- if (authorizationHeaderToken != null) {
|
|
|
|
- if (parameterToken != null) {
|
|
|
|
|
|
+ String accessToken = null;
|
|
|
|
+ for (String token : accessTokens) {
|
|
|
|
+ if (accessToken == null) {
|
|
|
|
+ accessToken = token;
|
|
|
|
+ }
|
|
|
|
+ else if (token != null) {
|
|
BearerTokenError error = BearerTokenErrors
|
|
BearerTokenError error = BearerTokenErrors
|
|
.invalidRequest("Found multiple bearer tokens in the request");
|
|
.invalidRequest("Found multiple bearer tokens in the request");
|
|
throw new OAuth2AuthenticationException(error);
|
|
throw new OAuth2AuthenticationException(error);
|
|
}
|
|
}
|
|
- return authorizationHeaderToken;
|
|
|
|
}
|
|
}
|
|
- if (parameterToken != null && parameterToken.isBlank()) {
|
|
|
|
|
|
+
|
|
|
|
+ if (accessToken != null && accessToken.isBlank()) {
|
|
BearerTokenError error = BearerTokenErrors
|
|
BearerTokenError error = BearerTokenErrors
|
|
.invalidRequest("The requested token parameter is an empty string");
|
|
.invalidRequest("The requested token parameter is an empty string");
|
|
throw new OAuth2AuthenticationException(error);
|
|
throw new OAuth2AuthenticationException(error);
|
|
}
|
|
}
|
|
- return parameterToken;
|
|
|
|
|
|
+
|
|
|
|
+ return accessToken;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String resolveFromAuthorizationHeader(HttpServletRequest request) {
|
|
|
|
+ String authorization = request.getHeader(this.bearerTokenHeaderName);
|
|
|
|
+ if (!StringUtils.startsWithIgnoreCase(authorization, "bearer")) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Matcher matcher = authorizationPattern.matcher(authorization);
|
|
|
|
+ if (!matcher.matches()) {
|
|
|
|
+ BearerTokenError error = BearerTokenErrors.invalidToken("Bearer token is malformed");
|
|
|
|
+ throw new OAuth2AuthenticationException(error);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return matcher.group("token");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String resolveAccessTokenFromQueryString(HttpServletRequest request) {
|
|
|
|
+ if (!this.allowUriQueryParameter || !HttpMethod.GET.name().equals(request.getMethod())) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return resolveToken(request.getParameterValues(ACCESS_TOKEN_PARAMETER_NAME));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String resolveAccessTokenFromBody(HttpServletRequest request) {
|
|
|
|
+ if (!this.allowFormEncodedBodyParameter
|
|
|
|
+ || !MediaType.APPLICATION_FORM_URLENCODED_VALUE.equals(request.getContentType())
|
|
|
|
+ || HttpMethod.GET.name().equals(request.getMethod())) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String queryString = request.getQueryString();
|
|
|
|
+ if (queryString != null && queryString.contains(ACCESS_TOKEN_PARAMETER_NAME)) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return resolveToken(request.getParameterValues(ACCESS_TOKEN_PARAMETER_NAME));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -106,49 +160,4 @@ public final class DefaultBearerTokenResolver implements BearerTokenResolver {
|
|
this.bearerTokenHeaderName = bearerTokenHeaderName;
|
|
this.bearerTokenHeaderName = bearerTokenHeaderName;
|
|
}
|
|
}
|
|
|
|
|
|
- private String resolveFromAuthorizationHeader(HttpServletRequest request) {
|
|
|
|
- String authorization = request.getHeader(this.bearerTokenHeaderName);
|
|
|
|
- if (!StringUtils.startsWithIgnoreCase(authorization, "bearer")) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- Matcher matcher = authorizationPattern.matcher(authorization);
|
|
|
|
- if (!matcher.matches()) {
|
|
|
|
- BearerTokenError error = BearerTokenErrors.invalidToken("Bearer token is malformed");
|
|
|
|
- throw new OAuth2AuthenticationException(error);
|
|
|
|
- }
|
|
|
|
- return matcher.group("token");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private String resolveFromRequestParameters(HttpServletRequest request) {
|
|
|
|
- if (!isParameterTokenEnabledForRequest(request)) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- String[] values = request.getParameterValues(ACCESS_TOKEN_PARAMETER_NAME);
|
|
|
|
- if (values == null || values.length == 0) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- if (values.length == 1) {
|
|
|
|
- return values[0];
|
|
|
|
- }
|
|
|
|
- BearerTokenError error = BearerTokenErrors.invalidRequest("Found multiple bearer tokens in the request");
|
|
|
|
- throw new OAuth2AuthenticationException(error);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private static boolean isGetRequest(HttpServletRequest request) {
|
|
|
|
- return HttpMethod.GET.name().equals(request.getMethod());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private static boolean isFormEncodedRequest(HttpServletRequest request) {
|
|
|
|
- return MediaType.APPLICATION_FORM_URLENCODED_VALUE.equals(request.getContentType());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private static boolean hasAccessTokenInQueryString(HttpServletRequest request) {
|
|
|
|
- return (request.getQueryString() != null) && request.getQueryString().contains(ACCESS_TOKEN_PARAMETER_NAME);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private boolean isParameterTokenEnabledForRequest(HttpServletRequest request) {
|
|
|
|
- return ((this.allowFormEncodedBodyParameter && isFormEncodedRequest(request) && !isGetRequest(request)
|
|
|
|
- && !hasAccessTokenInQueryString(request)) || (this.allowUriQueryParameter && isGetRequest(request)));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
}
|
|
}
|