Исходный IP-адрес отсутствует в APIGatewayProxyRequestEvent. ⇐ JAVA
-
Гость
Исходный IP-адрес отсутствует в APIGatewayProxyRequestEvent.
Я создаю лямбда-функцию, используя Spring-cloud-function (aws-adapter), которая будет действовать как конечная точка веб-перехватчика для Stripe. Лямбда-выражение настроило URL-адрес функции.
Я пытаюсь разрешить только запросы, поступающие с IP-адресов из белого списка. На данный момент код выглядит так:
//импорт опущен @SpringBootApplication @EnableConfigurationProperties(StripeProperties.class) Приложение публичного класса { частный статический окончательный APIGatewayProxyResponseEvent EVENT_PROCESSED = новый APIGatewayProxyResponseEvent() .withStatusCode(HttpStatus.OK.value()) .withBody("Событие обработано"); частный статический окончательный APIGatewayProxyResponseEvent INVALID_SIGNATURE = новый APIGatewayProxyResponseEvent() .withStatusCode(HttpStatus.BAD_REQUEST.value()) .withBody("Неверная подпись"); public static void main(String[] args) { FunctionalSpringApplication.run(Application.class, args); } @Бин public FunctionprocessEvent( StripeEventService StripeEventService) { запрос на возврат -> { // вар sourceIp = ???; // System.out.println(sourceIp); вар jsonPayload = request.getBody(); var sigHeader = request.getHeaders().get("stripe-signature"); если (sigHeader == null) { вернуть INVALID_SIGNATURE; } пытаться { var event = Webhook.constructEvent(jsonPayload, sigHeader, "whsec_..."); StripeEventService.processEvent(событие); вернуть EVENT_PROCESSED; } catch (SignatureVerificationException e) { вернуть INVALID_SIGNATURE; } }; } } Теперь при выполнении остаточного вызова сгенерированного URL-адреса функции зарегистрированный запрос JSON выглядит следующим образом (некоторые значения намеренно замаскированы):
{ "версия": "2.0", "routeKey": "$default", "rawPath": "/", "rawQueryString": "", "заголовки": { "длина контента": "21", "x-amzn-tls-version": "TLSv1.2", "x-forwarded-proto": "https", "postman-token": "4f4ded59-3c14-4961-a984-bb323f58ec82", "x-переадресованный порт": "443", "x-forwarded-for": "***.***.***.**", "принимать": "*/*", "x-amzn-tls-cipher-suite": "ECDHE-RSA-AES128-GCM-SHA256", "x-amzn-trace-id": "************", "host": "********.lambda-url.eu-central-1.on.aws", "тип контента": "приложение/json", "accept-encoding": "gzip, deflate, br", "пользовательский-агент": "PostmanRuntime/7.33.0" }, "requestContext": { "accountId": "анонимный", "apiId": "******", "domainName": "******.lambda-url.eu-central-1.on.aws", "domainPrefix": "******", "http": { "метод": "POST", "путь": "/", "протокол": "HTTP/1.1", "sourceIp": "***.***.***.**", "userAgent": "PostmanRuntime/7.33.0" }, "requestId": "***********", "routeKey": "$default", "stage": "$default", "time": "23/сен/2023:15:04:20 +0000", «Эпоха времени»: 1695481460790 }, "body": "{\n \"test\": \"123\"\n}", «isBase64Encoded»: ложь } Мне нужно значение $.requestContext.http.sourceIp. Однако я не могу получить значение из объекта APIGatewayProxyRequestEvent (документы), поскольку у него нет для него параметра.
Существуют похожие вопросы с ответами на использование $.requestContext.identity.sourceIp, но для меня это значение всегда равно нулю, поскольку я не использую никакого поставщика удостоверений. Также не рекомендуется использовать значение заголовка x-forwarded-for в соответствии с упомянутым вопросом.
Теперь вопрос в том, как я могу достичь своей цели безопасным способом?
Я создаю лямбда-функцию, используя Spring-cloud-function (aws-adapter), которая будет действовать как конечная точка веб-перехватчика для Stripe. Лямбда-выражение настроило URL-адрес функции.
Я пытаюсь разрешить только запросы, поступающие с IP-адресов из белого списка. На данный момент код выглядит так:
//импорт опущен @SpringBootApplication @EnableConfigurationProperties(StripeProperties.class) Приложение публичного класса { частный статический окончательный APIGatewayProxyResponseEvent EVENT_PROCESSED = новый APIGatewayProxyResponseEvent() .withStatusCode(HttpStatus.OK.value()) .withBody("Событие обработано"); частный статический окончательный APIGatewayProxyResponseEvent INVALID_SIGNATURE = новый APIGatewayProxyResponseEvent() .withStatusCode(HttpStatus.BAD_REQUEST.value()) .withBody("Неверная подпись"); public static void main(String[] args) { FunctionalSpringApplication.run(Application.class, args); } @Бин public FunctionprocessEvent( StripeEventService StripeEventService) { запрос на возврат -> { // вар sourceIp = ???; // System.out.println(sourceIp); вар jsonPayload = request.getBody(); var sigHeader = request.getHeaders().get("stripe-signature"); если (sigHeader == null) { вернуть INVALID_SIGNATURE; } пытаться { var event = Webhook.constructEvent(jsonPayload, sigHeader, "whsec_..."); StripeEventService.processEvent(событие); вернуть EVENT_PROCESSED; } catch (SignatureVerificationException e) { вернуть INVALID_SIGNATURE; } }; } } Теперь при выполнении остаточного вызова сгенерированного URL-адреса функции зарегистрированный запрос JSON выглядит следующим образом (некоторые значения намеренно замаскированы):
{ "версия": "2.0", "routeKey": "$default", "rawPath": "/", "rawQueryString": "", "заголовки": { "длина контента": "21", "x-amzn-tls-version": "TLSv1.2", "x-forwarded-proto": "https", "postman-token": "4f4ded59-3c14-4961-a984-bb323f58ec82", "x-переадресованный порт": "443", "x-forwarded-for": "***.***.***.**", "принимать": "*/*", "x-amzn-tls-cipher-suite": "ECDHE-RSA-AES128-GCM-SHA256", "x-amzn-trace-id": "************", "host": "********.lambda-url.eu-central-1.on.aws", "тип контента": "приложение/json", "accept-encoding": "gzip, deflate, br", "пользовательский-агент": "PostmanRuntime/7.33.0" }, "requestContext": { "accountId": "анонимный", "apiId": "******", "domainName": "******.lambda-url.eu-central-1.on.aws", "domainPrefix": "******", "http": { "метод": "POST", "путь": "/", "протокол": "HTTP/1.1", "sourceIp": "***.***.***.**", "userAgent": "PostmanRuntime/7.33.0" }, "requestId": "***********", "routeKey": "$default", "stage": "$default", "time": "23/сен/2023:15:04:20 +0000", «Эпоха времени»: 1695481460790 }, "body": "{\n \"test\": \"123\"\n}", «isBase64Encoded»: ложь } Мне нужно значение $.requestContext.http.sourceIp. Однако я не могу получить значение из объекта APIGatewayProxyRequestEvent (документы), поскольку у него нет для него параметра.
Существуют похожие вопросы с ответами на использование $.requestContext.identity.sourceIp, но для меня это значение всегда равно нулю, поскольку я не использую никакого поставщика удостоверений. Также не рекомендуется использовать значение заголовка x-forwarded-for в соответствии с упомянутым вопросом.
Теперь вопрос в том, как я могу достичь своей цели безопасным способом?
Мобильная версия