From a7e7113257b8ad758bc7ec00b781e3bb23a3d3f8 Mon Sep 17 00:00:00 2001 From: msailes Date: Fri, 25 Sep 2020 21:34:37 +0100 Subject: [PATCH 1/4] feat: V1 and V2 of the API Gateway custom authorizer event and the simplified IAM policy. --- .../APIGatewayCustomAuthorizerEvent.java | 59 +++++++++++++++++ .../APIGatewayV2CustomAuthorizerEvent.java | 66 +++++++++++++++++++ .../runtime/events/SimpleIAMPolicy.java | 23 +++++++ 3 files changed, 148 insertions(+) create mode 100644 aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayCustomAuthorizerEvent.java create mode 100644 aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java create mode 100644 aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicy.java diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayCustomAuthorizerEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayCustomAuthorizerEvent.java new file mode 100644 index 00000000..72883319 --- /dev/null +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayCustomAuthorizerEvent.java @@ -0,0 +1,59 @@ +package com.amazonaws.services.lambda.runtime.events; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +/** + * The API Gateway customer authorizer event object as described - https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html + * + */ + +@Data +@Builder(setterPrefix = "with") +@NoArgsConstructor +@AllArgsConstructor +public class APIGatewayCustomAuthorizerEvent { + + private String version; + private String type; + private String methodArn; + private String identitySource; + private String authorizationToken; + private String resource; + private String path; + private String httpMethod; + private Map headers; + private Map queryStringParameters; + private Map pathParameters; + private Map stageVariables; + private RequestContext requestContext; + + @Data + @Builder(setterPrefix = "with") + @NoArgsConstructor + @AllArgsConstructor + public static class RequestContext { + private String path; + private String accountId; + private String resourceId; + private String stage; + private String requestId; + private Identity identity; + private String resourcePath; + private String httpMethod; + private String apiId; + } + + @Data + @Builder(setterPrefix = "with") + @NoArgsConstructor + @AllArgsConstructor + public static class Identity { + private String apiKey; + private String sourceIp; + } +} \ No newline at end of file diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java new file mode 100644 index 00000000..4fd4d547 --- /dev/null +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java @@ -0,0 +1,66 @@ +package com.amazonaws.services.lambda.runtime.events; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * The V2 API Gateway customer authorizer event object as described - https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html + * + */ + +@Data +@Builder(setterPrefix = "with") +@NoArgsConstructor +@AllArgsConstructor +public class APIGatewayV2CustomAuthorizerEvent { + + private String version; + private String type; + private String routeArn; + private List identitySource; + private String routeKey; + private String rawPath; + private String rawQueryString; + private List cookies; + private Map headers; + private Map queryStringParameters; + private RequestContext requestContext; + private Map pathParameters; + private Map stageVariables; + + @Data + @Builder(setterPrefix = "with") + @NoArgsConstructor + @AllArgsConstructor + public static class RequestContext { + + private String accountId; + private String apiId; + private String domainName; + private String domainPrefix; + private Http http; + private String requestId; + private String routeKey; + private String stage; + private String time; // "time": "12/Mar/2020:19:03:58 +0000", + private int timeEpoch; + } + + @AllArgsConstructor + @Builder(setterPrefix = "with") + @Data + @NoArgsConstructor + public static class Http { + + private String method; + private String path; + private String protocol; + private String sourceIp; + private String userAgent; + } +} \ No newline at end of file diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicy.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicy.java new file mode 100644 index 00000000..379a42c9 --- /dev/null +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicy.java @@ -0,0 +1,23 @@ +package com.amazonaws.services.lambda.runtime.events; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +/** + * The simplified IAM Policy response object as described in https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html + * + */ + +@Data +@Builder(setterPrefix = "with") +@NoArgsConstructor +@AllArgsConstructor +public class SimpleIAMPolicy { + + private boolean isAuthorized; + private Map context; +} \ No newline at end of file From 2e6bd0c1d61b228500aa04fb3024beaf68ac112f Mon Sep 17 00:00:00 2001 From: msailes Date: Mon, 5 Oct 2020 20:31:27 +0100 Subject: [PATCH 2/4] Added get functions to provide a better dev experience. --- .../APIGatewayV2CustomAuthorizerEvent.java | 18 ++++++++-- ...APIGatewayV2CustomAuthorizerEventTest.java | 36 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 aws-lambda-java-events/src/test/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEventTest.java diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java index 4fd4d547..5512d293 100644 --- a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java @@ -4,7 +4,11 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import java.time.Instant; import java.util.List; import java.util.Map; @@ -39,6 +43,8 @@ public class APIGatewayV2CustomAuthorizerEvent { @AllArgsConstructor public static class RequestContext { + private static DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z"); // "28/Sep/2020:15:14:43 +0000" + private String accountId; private String apiId; private String domainName; @@ -47,8 +53,16 @@ public static class RequestContext { private String requestId; private String routeKey; private String stage; - private String time; // "time": "12/Mar/2020:19:03:58 +0000", - private int timeEpoch; + private String time; + private long timeEpoch; + + public Instant getTimeEpoch() { + return Instant.ofEpochMilli(timeEpoch); + } + + public DateTime getTime() { + return fmt.parseDateTime(time); + } } @AllArgsConstructor diff --git a/aws-lambda-java-events/src/test/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEventTest.java b/aws-lambda-java-events/src/test/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEventTest.java new file mode 100644 index 00000000..8f1662cd --- /dev/null +++ b/aws-lambda-java-events/src/test/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEventTest.java @@ -0,0 +1,36 @@ +package com.amazonaws.services.lambda.runtime.events; + +import org.junit.jupiter.api.Test; + +import java.time.Instant; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class APIGatewayV2CustomAuthorizerEventTest { + + private static final long TIME_EPOCH = 1601306426515L; + private static final String TIME = "28/Sep/2020:15:14:43 +0000"; + + @Test + public void testEpochLongAsAnInstant() { + APIGatewayV2CustomAuthorizerEvent customAuthorizerEvent = APIGatewayV2CustomAuthorizerEvent.builder() + .withRequestContext(APIGatewayV2CustomAuthorizerEvent.RequestContext.builder() + .withTimeEpoch(TIME_EPOCH) + .build()) + .build(); + + assertEquals(Instant.ofEpochMilli(1601306426515L), customAuthorizerEvent.getRequestContext().getTimeEpoch()); + } + + @Test + public void testTimeStringAsDateTime() { + APIGatewayV2CustomAuthorizerEvent customAuthorizerEvent = APIGatewayV2CustomAuthorizerEvent.builder() + .withRequestContext(APIGatewayV2CustomAuthorizerEvent.RequestContext.builder() + .withTime(TIME) + .build()) + .build(); + + assertNotNull(customAuthorizerEvent.getRequestContext().getTime()); + } +} \ No newline at end of file From afc30d9174e9fc4e0c0c8573a7f2a9ddd7c4003a Mon Sep 17 00:00:00 2001 From: msailes Date: Tue, 6 Oct 2020 10:47:36 +0100 Subject: [PATCH 3/4] removing comment --- .../runtime/events/APIGatewayV2CustomAuthorizerEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java index 5512d293..6abfe051 100644 --- a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayV2CustomAuthorizerEvent.java @@ -43,7 +43,7 @@ public class APIGatewayV2CustomAuthorizerEvent { @AllArgsConstructor public static class RequestContext { - private static DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z"); // "28/Sep/2020:15:14:43 +0000" + private static DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z"); private String accountId; private String apiId; From 41ad4b1fc725cb8692ca243d471cc5d1c590d787 Mon Sep 17 00:00:00 2001 From: msailes Date: Wed, 7 Oct 2020 11:19:31 +0100 Subject: [PATCH 4/4] feat: V1 and V2 of the API Gateway custom authorizer event and the simplified IAM policy. --- .../{SimpleIAMPolicy.java => SimpleIAMPolicyResponse.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/{SimpleIAMPolicy.java => SimpleIAMPolicyResponse.java} (92%) diff --git a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicy.java b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicyResponse.java similarity index 92% rename from aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicy.java rename to aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicyResponse.java index 379a42c9..030a1468 100644 --- a/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicy.java +++ b/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/SimpleIAMPolicyResponse.java @@ -16,7 +16,7 @@ @Builder(setterPrefix = "with") @NoArgsConstructor @AllArgsConstructor -public class SimpleIAMPolicy { +public class SimpleIAMPolicyResponse { private boolean isAuthorized; private Map context;