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

问题描述

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

解决方法

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

如果 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 标头传递给后端

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

,

enter image description here

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

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