如何获取 lambda 授权方在 spring 引导容器中添加的自定义上下文信息? AWS Apigateway HTTP API

How to get custom context information added by lambda authorizer in spring boot container? AWS Apigateway HTTP API

我们正在使用 AWS ECS 服务 运行 一个容器,我们在该容器中 运行ning spring 引导应用程序。这是使用 AWS Apigateway HTTP API 公开的。此 AWS Apigateway HTTP API 使用 lambda 授权方进行保护。现在我想在 lambda 授权方中为每个请求添加一些信息,并且我想在 spring 启动应用程序方法中访问该信息。我该怎么做?

Custom Authorizer's 上下文将作为 http headers 传递,我们可以简单地记录 http headers 来验证。

如果 api 网关授权方返回的策略是

{
    "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 headers 传递给后端

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 测试的,但它们仍应是 headers 的一部分,名称可能略有不同。

我们必须在 lambda 授权方的响应中将 context 字段设置为对象(键值对)。

然后,我们必须如图所示设置参数映射。之后我们可以使用 Balu Vyamajala 的代码在 spring 引导控制器的方法中获取这些值。