HTTP API AWS API Gateway v2 удаляет заполнение (`=`) из параметров запроса при вызове Lambda (Java Spring Boot)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 HTTP API AWS API Gateway v2 удаляет заполнение (`=`) из параметров запроса при вызове Lambda (Java Spring Boot)

Сообщение Anonymous »

Я использую AWS API Gateway HTTP API v2 с функцией Lambda, запускающей приложение Java Spring Boot.

Тип интеграции — интеграция прокси-сервера Lambda с payloadFormatVersion: 2.0.
Все работает нормально, за исключением того, что параметры запроса изменяются API Gateway до достижения моего приложения Spring Boot.
проблема
Когда я вызываю эту конечную точку:

Код: Выделить всё

GET https://api.example.com/welcome?param1=aGVsbG8gbXkgbmFtZSBpcyBqb2huCg==
Что я вижу в журналах

Код: Выделить всё

DEBUG --- Securing GET /welcome?param1=aGVsbG8gbXkgbmFtZSBpcyBqb2huCg==
DEBUG --- GET "/welcome?param1=aGVsbG8gbXkgbmFtZSBpcyBqb2huCg=="
INFO  --- preHandle: method=GET, uri=/welcome, parameters=[param1=aGVsbG8gbXkgbmFtZSBpcyBqb2huCg]
Как видите, запрос приходит с правильным значением ( присутствует)[/b],

но к тому моменту, когда Spring обработает это, заполнение отсутствует.

Что я пробовал
Чтобы обойти эту проблему, я добавил фильтр, который пытается автоматически восстанавливать отсутствующее заполнение Base64 при необходимости:

Код: Выделить всё

@Component
@Order(HIGHEST_PRECEDENCE)
public class Base64PaddingFixFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(
HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {

var originalParams = request.getParameterMap();

var fixedParams = originalParams.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> Arrays.stream(e.getValue())
.map(Base64PaddingFixFilter::padBase64IfNeeded)
.toArray(String[]::new)));

var hasModifiedParams = !fixedParams.equals(originalParams);

if (hasModifiedParams) {
var wrapped = new FixedParamsRequestWrapper(request, fixedParams);
filterChain.doFilter(wrapped, response);
} else {
filterChain.doFilter(request, response);
}
}

private static String padBase64IfNeeded(String s) {
if (s == null) return null;
var len = s.length();
if (len == 0) return s;

var base64UrlPattern = "^[A-Za-z0-9_\\-]+=*$";
if (!s.matches(base64UrlPattern)) return s;

var mod = len % 4;
if (mod == 0) return s;
var pad = 4 - mod;
return s + "=".repeat(pad);
}

private static class FixedParamsRequestWrapper extends HttpServletRequestWrapper {
private final Map fixedParams;

public FixedParamsRequestWrapper(HttpServletRequest request, Map fixedParams) {
super(request);
this.fixedParams = fixedParams;
}

@Override public String getParameter(String name) {
var values = fixedParams.get(name);
return (values != null && values.length > 0) ? values[0] : null;
}

@Override public Map getParameterMap() { return fixedParams; }
@Override public String[] getParameterValues(String name) { return fixedParams.get(name); }
}
}
Это работает для параметров Base64 — он обнаруживает и восстанавливает пропущенные символы =.

Проблема с этим обходным решением
Если параметр запроса не Base64, но соответствует шаблону Base64 (

Код: Выделить всё

[A-Za-z0-9_-]+=*
),

фильтр неправильно добавляет к нему дополнение, рассматривая его как «поврежденное» значение Base64.
Пример:

Код: Выделить всё

GET /welcome?param1=abc
становится:

Код: Выделить всё

param1=abc=
что явно неверно.
Таким образом, этот подход ненадежен, если все параметры запроса не гарантированно закодированы в Base64.

Вопросы

[*]Почему API Gateway HTTP API v2 удаляет или изменяет заполнение () в параметрах запроса перед вызовом Lambda?

[*]Есть ли способ настроить API-шлюз так, чтобы сохранять параметры запроса в том виде, в котором они были отправлены (без декодирования/перекодирования)?

[*]Есть ли более надежный обходной путь, чем проверка и повторное заполнение параметров вручную?



Подробнее здесь: https://stackoverflow.com/questions/798 ... s-when-cal
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»