请求到达EKS集群前解码Authorization Token的实现方案咨询
先理清各工具的适用场景
- CloudFront Functions:仅支持简单的请求/响应头修改、字符串处理,无法调用外部服务(比如Cognito的令牌验证API),完全不适合你的令牌解码需求。
- Lambda@Edge:可在CloudFront边缘节点运行,能调用外部服务,但更适合需要在CDN层做全局处理的场景(比如基于用户信息缓存内容),对于后端服务的令牌解码+头替换,API Gateway层的方案更直接、易维护。
- Lambda Authorizer(自定义授权器):API Gateway原生组件,专门用于API的认证与授权,支持验证令牌、解码用户信息,并将自定义上下文传递到后端,完全匹配你的需求。
核心实现方案
你之前的误解在于:Lambda Authorizer并不是需要API Gateway额外调用的后端服务,而是API Gateway处理请求的前置认证环节——先运行Authorizer验证令牌有效性、解码用户信息,再将携带修改后请求头的请求转发到EKS后端,整个流程是单链路的,不存在"调用两个后端"的问题。
步骤1:编写Lambda Authorizer函数
这个函数负责接收请求中的Authorization令牌,验证其有效性(通过Cognito公钥),解码后将用户信息存入上下文,供API Gateway后续使用。
示例代码(Python):
import json from jose import jwt import os # 从环境变量读取配置,避免硬编码 COGNITO_USER_POOL_ID = os.environ['COGNITO_USER_POOL_ID'] COGNITO_CLIENT_ID = os.environ['COGNITO_CLIENT_ID'] COGNITO_REGION = os.environ['COGNITO_REGION'] JWKS_URI = f'https://cognito-idp.{COGNITO_REGION}.amazonaws.com/{COGNITO_USER_POOL_ID}/.well-known/jwks.json' def lambda_handler(event, context): # 提取Bearer令牌 try: token = event['authorizationToken'].split(' ')[1] except (IndexError, KeyError): raise Exception('Unauthorized') # 验证并解码JWT令牌 try: decoded_token = jwt.decode( token, JWKS_URI, audience=COGNITO_CLIENT_ID, issuer=f'https://cognito-idp.{COGNITO_REGION}.amazonaws.com/{COGNITO_USER_POOL_ID}', options={"verify_exp": True} ) except Exception as e: raise Exception('Unauthorized') # 组装解码后的用户信息(按需调整字段) user_info = json.dumps({ 'user_id': decoded_token['sub'], 'username': decoded_token['cognito:username'], 'email': decoded_token.get('email'), 'groups': decoded_token.get('cognito:groups', []) }) # 返回授权结果,将用户信息存入context return { 'principalId': decoded_token['sub'], 'policyDocument': { 'Version': '2012-10-17', 'Statement': [{ 'Action': 'execute-api:Invoke', 'Effect': 'Allow', 'Resource': event['methodArn'] }] }, 'context': { 'userInfo': user_info } }
步骤2:配置API Gateway与Lambda Authorizer关联
- 在API Gateway控制台中,进入你的API,选择需要保护的方法(如GET/POST)。
- 切换到「方法请求」标签,在「授权」选项中选择你创建的Lambda Authorizer,类型选「TOKEN」,令牌来源设为
method.request.header.Authorization。
步骤3:配置API Gateway集成请求的头映射
将Lambda Authorizer返回的用户信息映射到请求头,替换原有的Authorization令牌:
- 进入该方法的「集成请求」标签。
- 在「HTTP请求头」区域,点击「添加头」:
- 名称填
Authorization(或自定义头名,如X-Decoded-User-Info) - 值填
$context.authorizer.userInfo(对应Lambda返回的context中的userInfo字段)
- 名称填
- 保存并部署API。
步骤4:API Gateway集成EKS后端
将API Gateway与EKS集群中的Spring服务对接:
- 将Spring服务暴露为**Network Load Balancer(NLB)**类型的Kubernetes Service。
- 在API Gateway中创建「HTTP集成」,目标指向NLB的域名和端口,配置路径映射规则。
替代方案:Lambda集成预处理(不推荐)
如果不想用Lambda Authorizer,也可以在API Gateway的集成请求前添加Lambda集成做预处理:
- 创建Lambda函数解码令牌,生成用户信息。
- API Gateway先调用该Lambda,获取用户信息后,再将请求转发到EKS后端。
但这种方案缺少原生的认证校验逻辑,需要自行处理令牌有效性验证,不如Lambda Authorizer安全、简洁。
内容的提问来源于stack exchange,提问作者nmnsharma007
相关产品推荐
相关产品推荐

