Skip to content

Commit 4380cc0

Browse files
sapessidependabot[bot]eranation
authored
Draft pull request for 1.5 release (#331)
* Bump spring.version in /aws-serverless-java-container-spring (#319) Bumps `spring.version` from 5.1.9.RELEASE to 5.2.3.RELEASE. Updates `spring-webmvc` from 5.1.9.RELEASE to 5.2.3.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](spring-projects/spring-framework@v5.1.9.RELEASE...v5.2.3.RELEASE) Updates `spring-test` from 5.1.9.RELEASE to 5.2.3.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](spring-projects/spring-framework@v5.1.9.RELEASE...v5.2.3.RELEASE) Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump spring-webflux in /aws-serverless-java-container-springboot2 (#318) Bumps [spring-webflux](https://github.com/spring-projects/spring-framework) from 5.1.9.RELEASE to 5.2.0.RELEASE. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](spring-projects/spring-framework@v5.1.9.RELEASE...v5.2.0.RELEASE) Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ci: Fixing Spring build to use 5.2 as latest * chore(deps): Bump Spring 5.1 path release to address a security vulnerability * chore(deps): Fixing usual spring dependency mess with exlusions out of the spring-security package used in the tests * Fix for issue #317 (#323) * fix issue 317 - use charset from request * update dependencies * update build dependencies, remove spring boot 2.0.x * restoring ci config Co-authored-by: Stefano Buliani <[email protected]> * test: Fixed Spring security tests for SpringBoot 2, added validation tests and updated servlet tests to use the new servletApplication option * fix: Avoid flushing the response buffer if we are dispatching the request asynchronously. This was causing race conditions in the SpringBoot 2 WebFlux implementation - requests that had to run through security or validation filters took longer and the library flushed an empty request, which caused the status code to default to 200. This fix addresses issues #279, #304, and #306 * chore(deps): Bump spring dependency version and added webmvc optional dependency to truly support Servlet-only server * feat: New application type parameter to SpringBootLambdaContainerHandler that tells the framework whether to start a reactive or servlet-based embedded server. Also added a new servletApplication method to the builder object. * test: Fixed UTF-8 encoding test * ci: Fixed dependencies for CI run on SpringBoot 2 * ci: More Spring dependency convergence issues during CI * fix: Added null-check on getServerName in case the multi-value headers property is null. Unlikely outside of tests but better safe than sorry. This addresses #327 * fix: Changed servlet initialization mechanism so that servlet that requests load on startup are initialized right away, as part of the initialization() method call in LambdaServletContainerHandler. Also centralized the lazy Servlet initialization to the ServletExecutionFilter so that we don't have code scattered all around. This begins to address #287 * feat: Added new 0-parameter constructor for async initializer that uses the actual JVM start time to calculate the timeout milliseconds. Also added the new method to the builder object and deprecated the current method that receives a milliseconds epoch parameter. I'm not deprecating the constructor of the async initializer class that receives the parameter as it may still be useful for tests. This change was suggested in #287 * fix: Updated SpringBoot 1.x handler to use the new servlet initialization mechanism * ci: switch SpringBoot slow integration test to use a custom async time since the JVM is reused for both tests in the and we cannot reuse the actual JVM init time * feat: New models for HTTP API support for #329 * feat: First implementation of HTTP API servlet request, request reader, and security context writer - continuing to address #329 * test: Basic unit tests for the new HTTP API support in core library (#329) * feat: Updated log formatter to support both versions (1 and 2) of the proxy request model (#329) * feat: Further generified request readers to read to a generic HttpServletRequest rather than specific implementations of it. This makes it easier to create container handler implementations that support HTTP API, API Gateway, and ALB (#329) * test: Fixed tests for new logged and generified request readers * feat: Added HTTP API support to Jersey implementation with new getHttpApiV2ProxyHandler method (#329) * feat: Added HTTP API support to Spark implementation (#329) * feat: Added HTTP API support to Spring implementation (#329) * feat: HTTP API support in SpringBoot 2 implementation. bug: Fixed an issue with the implementation of AsyncContext where it wasn't dispatching if the handler wasn't set * feat: First pass of HTTP API support in struts 2 implementation (#329) * fix: Added support for HTTP APIs to the request dispatcher * chore(deps): Dependency bump all around. Rotated Jersey ci versions * fix: Updated stream handling logic to work with reactive applications as suggested in #316 * test: Added unit test to replicate #333 * feat: New configuration parameter to skip exception mapping and allow exception to bubble up from #307 * fix: Fixed spotbugs issue in RuntimeException cast * test: Added tests for more complex content types mentioned in issue #315 * docs: Updated samples to support SAM CLI operations out of the box to address #293 and switched to HTTP API by default * feat: Updated archetypes to work out of the box with the SAM CLI, continuing to address #293 * chore: License header pass on the entire project * fix: Set default value for setDisableException mapper in config to false * fix: Updated default initialization timeout to 20 seconds Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eran Medan <[email protected]>
1 parent 5c655bd commit 4380cc0

File tree

156 files changed

+4579
-2073
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

156 files changed

+4579
-2073
lines changed

.github/workflows/continuous-integration-workflow.yml

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ jobs:
2222
- uses: actions/checkout@v2
2323
- name: Build latest
2424
run: ./gha_build.sh jersey true true
25-
- name: Build Jersey 2.26
26-
run: ./gha_build.sh jersey false false -Djersey.version=2.26
2725
- name: Build Jersey 2.27
2826
run: ./gha_build.sh jersey false false -Djersey.version=2.27
2927
- name: Build Jersey 2.28
3028
run: ./gha_build.sh jersey false false -Djersey.version=2.28
29+
- name: Build Jersey 2.29
30+
run: ./gha_build.sh jersey false false -Djersey.version=2.29.1
3131

3232
build_spark:
3333
name: Build and test Spark
@@ -45,17 +45,15 @@ jobs:
4545
steps:
4646
- uses: actions/checkout@v2
4747
- name: Build latest
48-
run: ./gha_build.sh spring true true
48+
# we reduce the minCoverage for this run because it will skip the SpringBoot 1.5 tests since they are no longer compatible with
49+
# Spring core 5.2 and above. SpringBoot 1.5 is deprecated
50+
run: ./gha_build.sh spring true true -Djacoco.minCoverage=0.4
4951
- name: Build Spring 4.3
5052
run: ./gha_build.sh spring false false -Dspring.version=4.3.25.RELEASE -Dspring-security.version=4.2.13.RELEASE
5153
- name: Build Spring 5.0
52-
run: ./gha_build.sh spring false false -Dspring.version=5.0.15.RELEASE -Dspring-security.version=5.0.13.RELEASE
54+
run: ./gha_build.sh spring false false -Dspring.version=5.0.16.RELEASE -Dspring-security.version=5.0.14.RELEASE
5355
- name: Build Spring 5.1
5456
run: ./gha_build.sh spring false false -Dspring.version=5.1.14.RELEASE -Dspring-security.version=5.1.8.RELEASE
55-
- name: Build Spring 5.2
56-
# we reduce the minCoverage for this run because it will skip the SpringBoot 1.5 tests since they are no longer compatible with
57-
# Spring core 5.2 and above. SpringBoot 1.5 is deprecated
58-
run: ./gha_build.sh spring false false -Dspring.version=5.2.5.RELEASE -Dspring-security.version=5.2.2.RELEASE -Djacoco.minCoverage=0.4
5957

6058
build_springboot2:
6159
name: Build and test SpringBoot 2
@@ -65,11 +63,9 @@ jobs:
6563
- name: Build latest
6664
run: ./gha_build.sh springboot2 true true
6765
- name: Build Spring Boot 2.0
68-
run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.13.RELEASE -Dspringsecurity.version=5.0.12.RELEASE
66+
run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.16.RELEASE -Dspringsecurity.version=5.0.14.RELEASE
6967
- name: Build Spring Boot 2.1
70-
run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.1.10.RELEASE -Dspring.version=5.1.11.RELEASE -Dspringsecurity.version=5.1.7.RELEASE
71-
- name: Build Spring Boot 2.2
72-
run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.1.RELEASE -Dspring.version=5.2.1.RELEASE -Dspringsecurity.version=5.2.1.RELEASE
68+
run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.1.12.RELEASE -Dspring.version=5.1.13.RELEASE -Dspringsecurity.version=5.1.8.RELEASE
7369

7470
build_struts2:
7571
name: Build and test Struts 2

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,7 @@ gradlew*
2929

3030
# Exclude maven wrapper
3131
!/.mvn/wrapper/maven-wrapper.jar
32+
33+
# SAM files
34+
samconfig.toml
35+
.aws-sam/

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
/*
2+
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5+
* with the License. A copy of the License is located at
6+
*
7+
* http://aws.amazon.com/apache2.0/
8+
*
9+
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
10+
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
11+
* and limitations under the License.
12+
*/
113
package com.amazonaws.serverless.proxy;
214

315
import com.amazonaws.serverless.exceptions.ContainerInitializationException;
@@ -7,6 +19,7 @@
719
import org.slf4j.Logger;
820
import org.slf4j.LoggerFactory;
921

22+
import java.lang.management.ManagementFactory;
1023
import java.time.Instant;
1124
import java.util.concurrent.CountDownLatch;
1225
import java.util.concurrent.TimeUnit;
@@ -25,7 +38,7 @@
2538
* seconds has already been used up.
2639
*/
2740
public class AsyncInitializationWrapper extends InitializationWrapper {
28-
private static final int INIT_GRACE_TIME_MS = 250;
41+
private int INIT_GRACE_TIME_MS = 250;
2942
private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000;
3043

3144
private CountDownLatch initializationLatch;
@@ -41,6 +54,15 @@ public AsyncInitializationWrapper(long startTime) {
4154
actualStartTime = startTime;
4255
}
4356

57+
/**
58+
* Creates a new instance of the async initializer using the actual JVM start time as the starting point to measure
59+
* the 10 seconds timeout.
60+
*/
61+
public AsyncInitializationWrapper() {
62+
actualStartTime = ManagementFactory.getRuntimeMXBean().getStartTime();
63+
INIT_GRACE_TIME_MS = 150;
64+
}
65+
4466
@Override
4567
public void start(LambdaContainerHandler handler) throws ContainerInitializationException {
4668
initializationLatch = new CountDownLatch(1);
@@ -50,7 +72,7 @@ public void start(LambdaContainerHandler handler) throws ContainerInitialization
5072
try {
5173
long curTime = Instant.now().toEpochMilli();
5274
// account for the time it took to call the various constructors with the actual start time + a grace of 500ms
53-
long awaitTime = LAMBDA_MAX_INIT_TIME_MS - (curTime - actualStartTime) - INIT_GRACE_TIME_MS;
75+
long awaitTime = (actualStartTime + LAMBDA_MAX_INIT_TIME_MS) - curTime - INIT_GRACE_TIME_MS;
5476
log.info("Async initialization will wait for " + awaitTime + "ms");
5577
if (!initializationLatch.await(awaitTime, TimeUnit.MILLISECONDS)) {
5678
log.info("Initialization took longer than " + LAMBDA_MAX_INIT_TIME_MS + ", setting new CountDownLatch and " +
@@ -65,6 +87,10 @@ public void start(LambdaContainerHandler handler) throws ContainerInitialization
6587
}
6688
}
6789

90+
public long getActualStartTimeMs() {
91+
return actualStartTime;
92+
}
93+
6894
@Override
6995
public CountDownLatch getInitializationLatch() {
7096
return initializationLatch;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5+
* with the License. A copy of the License is located at
6+
*
7+
* http://aws.amazon.com/apache2.0/
8+
*
9+
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
10+
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
11+
* and limitations under the License.
12+
*/
13+
package com.amazonaws.serverless.proxy;
14+
15+
import com.amazonaws.serverless.proxy.internal.jaxrs.AwsHttpApiV2SecurityContext;
16+
import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest;
17+
import com.amazonaws.services.lambda.runtime.Context;
18+
19+
import javax.ws.rs.core.SecurityContext;
20+
21+
public class AwsHttpApiV2SecurityContextWriter implements SecurityContextWriter<HttpApiV2ProxyRequest> {
22+
@Override
23+
public SecurityContext writeSecurityContext(HttpApiV2ProxyRequest event, Context lambdaContext) {
24+
return new AwsHttpApiV2SecurityContext(lambdaContext, event);
25+
}
26+
}

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
/*
2+
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5+
* with the License. A copy of the License is located at
6+
*
7+
* http://aws.amazon.com/apache2.0/
8+
*
9+
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
10+
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
11+
* and limitations under the License.
12+
*/
113
package com.amazonaws.serverless.proxy;
214

315
import com.amazonaws.serverless.exceptions.ContainerInitializationException;

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1+
/*
2+
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5+
* with the License. A copy of the License is located at
6+
*
7+
* http://aws.amazon.com/apache2.0/
8+
*
9+
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
10+
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
11+
* and limitations under the License.
12+
*/
113
package com.amazonaws.serverless.proxy;
214

3-
415
import javax.ws.rs.core.SecurityContext;
516

6-
717
/**
818
* Implementations of the log formatter interface are used by {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler} class to log each request
919
* processed in the container. You can set the log formatter using the {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler#setLogFormatter(LogFormatter)}

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,20 @@ public abstract class RequestReader<RequestType, ContainerRequestType> {
6565
*/
6666
public static final String JAX_SECURITY_CONTEXT_PROPERTY = "com.amazonaws.serverless.jaxrs.securityContext";
6767

68+
/**
69+
* The key for the <strong>HTTP API</strong> request context passed by the services
70+
*/
71+
public static final String HTTP_API_CONTEXT_PROPERTY = "com.amazonaws.httpapi.request.context";
6872

73+
/**
74+
* The key for the <strong>HTTP API</strong> stage variables
75+
*/
76+
public static final String HTTP_API_STAGE_VARS_PROPERTY = "com.amazonaws.httpapi.stage.variables";
77+
78+
/**
79+
* The key for the <strong>HTTP API</strong> proxy request event
80+
*/
81+
public static final String HTTP_API_EVENT_PROPERTY = "com.amazonaws.httpapi.request";
6982

7083
//-------------------------------------------------------------
7184
// Methods - Abstract

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,15 @@ public ResponseType proxy(RequestType request, Context context) {
223223
// the latch will do nothing
224224
latch.countDown();
225225

226-
return exceptionHandler.handle(e);
226+
if (getContainerConfig().isDisableExceptionMapper()) {
227+
if (e instanceof RuntimeException) {
228+
throw (RuntimeException) e;
229+
} else {
230+
throw new RuntimeException(e);
231+
}
232+
} else {
233+
return exceptionHandler.handle(e);
234+
}
227235
}
228236
}
229237

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1+
/*
2+
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5+
* with the License. A copy of the License is located at
6+
*
7+
* http://aws.amazon.com/apache2.0/
8+
*
9+
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
10+
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
11+
* and limitations under the License.
12+
*/
113
package com.amazonaws.serverless.proxy.internal;
214

3-
415
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
516
import org.slf4j.Logger;
617
import org.slf4j.LoggerFactory;
@@ -11,7 +22,6 @@
1122
import java.util.Locale;
1223
import java.util.Set;
1324

14-
1525
/**
1626
* This class contains utility methods to address FSB security issues found in the application, such as string sanitization
1727
* and file path validation.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/*
2+
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5+
* with the License. A copy of the License is located at
6+
*
7+
* http://aws.amazon.com/apache2.0/
8+
*
9+
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
10+
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
11+
* and limitations under the License.
12+
*/
13+
package com.amazonaws.serverless.proxy.internal.jaxrs;
14+
15+
import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
16+
import com.amazonaws.serverless.proxy.internal.SecurityUtils;
17+
import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest;
18+
import com.amazonaws.services.lambda.runtime.Context;
19+
import com.fasterxml.jackson.core.JsonProcessingException;
20+
import com.fasterxml.jackson.databind.JsonNode;
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
23+
24+
import javax.ws.rs.core.HttpHeaders;
25+
import javax.ws.rs.core.SecurityContext;
26+
import java.nio.charset.StandardCharsets;
27+
import java.security.Principal;
28+
import java.util.Base64;
29+
30+
public class AwsHttpApiV2SecurityContext implements SecurityContext {
31+
public static final String AUTH_SCHEME_JWT = "JWT";
32+
33+
private static Logger log = LoggerFactory.getLogger(AwsHttpApiV2SecurityContext.class);
34+
35+
private Context lambdaContext;
36+
private HttpApiV2ProxyRequest event;
37+
38+
public AwsHttpApiV2SecurityContext(final Context lambdaCtx, final HttpApiV2ProxyRequest request) {
39+
lambdaContext = lambdaCtx;
40+
event = request;
41+
}
42+
43+
@Override
44+
public Principal getUserPrincipal() {
45+
if (getAuthenticationScheme() == null || !event.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) {
46+
return null;
47+
}
48+
49+
String authValue = event.getHeaders().get(HttpHeaders.AUTHORIZATION);
50+
if (authValue.startsWith("Bearer ")) {
51+
authValue = authValue.replace("Bearer ", "");
52+
}
53+
String[] parts = authValue.split("\\.");
54+
if (parts.length != 3) {
55+
log.warn("Could not parse JWT token for requestId: " + SecurityUtils.crlf(event.getRequestContext().getRequestId()));
56+
return null;
57+
}
58+
String decodedBody = new String(Base64.getMimeDecoder().decode(parts[1]), StandardCharsets.UTF_8);
59+
try {
60+
JsonNode parsedBody = LambdaContainerHandler.getObjectMapper().readTree(decodedBody);
61+
if (!parsedBody.isObject() && parsedBody.has("sub")) {
62+
log.debug("Could not find \"sub\" field in JWT body for requestId: " + SecurityUtils.crlf(event.getRequestContext().getRequestId()));
63+
return null;
64+
}
65+
String subject = parsedBody.get("sub").asText();
66+
return (() -> {
67+
return subject;
68+
});
69+
} catch (JsonProcessingException e) {
70+
log.error("Error while attempting to parse JWT body for requestId: " + SecurityUtils.crlf(event.getRequestContext().getRequestId()), e);
71+
return null;
72+
}
73+
74+
}
75+
76+
@Override
77+
public boolean isUserInRole(String s) {
78+
if (getAuthenticationScheme() == null) {
79+
return false;
80+
}
81+
82+
return event.getRequestContext().getAuthorizer().getJwtAuthorizer().getScopes().contains(s) ||
83+
event.getRequestContext().getAuthorizer().getJwtAuthorizer().getClaims().containsKey(s);
84+
85+
}
86+
87+
@Override
88+
public boolean isSecure() {
89+
return getAuthenticationScheme() != null;
90+
}
91+
92+
@Override
93+
public String getAuthenticationScheme() {
94+
if (event.getRequestContext().getAuthorizer() == null) {
95+
return null;
96+
}
97+
if (event.getRequestContext().getAuthorizer().isJwt()) {
98+
return AUTH_SCHEME_JWT;
99+
}
100+
return null;
101+
}
102+
}

0 commit comments

Comments
 (0)