Как получить пользовательскую информацию о контексте, добавленную lambda authorizer в spring boot container? AWS Apigateway HTTP API

#amazon-web-services #spring-boot #lambda-authorizer

#amazon-web-services #spring-boot #lambda-authorizer

Вопрос:

Мы используем сервис AWS ECS для запуска контейнера, мы запускаем приложение spring boot в этом контейнере. Это доступно с помощью AWS Apigateway HTTP API. Этот AWS Apigateway HTTP API защищен с помощью lambda authorizer. Теперь я хочу добавить некоторую информацию к каждому запросу в lambda authorizer, и я хочу получить доступ к этой информации в методе приложения spring boot. Как я могу это сделать?

Комментарии:

1. они должны быть просто частью http-заголовков, вы регистрировали заголовки, чтобы проверить, существуют ли заголовки контекста?

2. вместо того, чтобы записывать ее в lambda authorizer, вы можете записать ее в APIGateway и делегировать ее конкретному запросу

Ответ №1:

Контекст пользовательского авторизатора будет передан как http-заголовки, и мы можем просто зарегистрировать http-заголовки для проверки.

если политика, возвращаемая авторизатором api gateway, является

 {
    "principalId": "user",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": [
                    "arn:aws:execute-api:us-east-1:655648606120:nnnn1111ab/mystage/*"
                ]
            }
        ]
    },
    "context": {
        "userName": "My User Name",
        "userId": "myid",
        "groups": "Admin,User"
    }
}
 

Они будут переданы в качестве http-заголовков в серверную часть

 package com.test.config.interceptor;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.amway.na.api.model.ApiEnum;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class ApiLoggerInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        ApiEnum api = ApiEnum.get(request.getRequestURI());
        if (api.getLoggingRequired()) {

            StringBuilder headers = new StringBuilder();
            for (Enumeration<?> e = request.getHeaderNames(); e.hasMoreElements();) {
                String nextHeaderName = (String) e.nextElement();
                String headerValue = request.getHeader(nextHeaderName);
                headers.append("[").append(nextHeaderName).append(":").append(headerValue).append("] ");
            }
            log.debug("Execution of Api Starts: URI {} {}", request.getRequestURI(), headers);
        }
        return true;
    }
}
 

должно отображаться

 [x-test-user-name:my user name] [x-test-groups:Admin,User] [x-test-user-id:myid] [accept:application/json, text/plain, */*] [accept-encoding:gzip, deflate, br] [accept-language:en-US,en;q=0.9] [authentication:Beare...
 

Это проверено на REST API, а не на HTTP Api, но они все равно должны быть частью заголовков, имена могут немного отличаться.

Ответ №2:

введите описание изображения здесь

Мы должны установить поле контекста для объекта (пары ключ-значение) в ответе lambda authorizer.

Затем мы должны установить сопоставление параметров, как показано на рисунке. После этого мы можем использовать код Balu Vyamajala для получения этих значений в методах spring boot controller.