You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求到达EKS集群前解码Authorization Token的实现方案咨询

解决方案:用API Gateway Lambda Authorizer实现令牌解码与头替换

先理清各工具的适用场景

  • 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关联

  1. 在API Gateway控制台中,进入你的API,选择需要保护的方法(如GET/POST)。
  2. 切换到「方法请求」标签,在「授权」选项中选择你创建的Lambda Authorizer,类型选「TOKEN」,令牌来源设为method.request.header.Authorization。

步骤3:配置API Gateway集成请求的头映射

将Lambda Authorizer返回的用户信息映射到请求头,替换原有的Authorization令牌:

  1. 进入该方法的「集成请求」标签。
  2. 在「HTTP请求头」区域,点击「添加头」:
    • 名称填Authorization(或自定义头名,如X-Decoded-User-Info)
    • 值填$context.authorizer.userInfo(对应Lambda返回的context中的userInfo字段)
  3. 保存并部署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集成做预处理:

  1. 创建Lambda函数解码令牌,生成用户信息。
  2. API Gateway先调用该Lambda,获取用户信息后,再将请求转发到EKS后端。
    但这种方案缺少原生的认证校验逻辑,需要自行处理令牌有效性验证,不如Lambda Authorizer安全、简洁。

内容的提问来源于stack exchange,提问作者nmnsharma007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:46:15