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

多Cognito用户池场景:如何在API Gateway识别用户所属池并传值给Lambda

解决方案:识别Cognito用户池并传递标识到Lambda

一、核心原理:从Cognito Token中提取用户池标识

用户通过Cognito认证后获得的ID Token或Access Token中,iss(签发者)字段是唯一标识用户池的关键。该字段格式为:
https://cognito-idp.<AWS区域>.amazonaws.com/<用户池ID>
其中最后一段的<用户池ID>就是每个用户池的唯一标识,可直接用来区分用户所属的子公司数据源。

二、在API Gateway层面传递用户池标识到Lambda

完全可以在API Gateway层面完成判断并传递标识,有两种常用实现方式:

方式1:通过Cognito Authorizer上下文直接传递

  1. 为API Gateway配置Cognito Authorizer时,确保开启token验证逻辑。
  2. Lambda的触发事件中会自动包含授权上下文信息,可从event['requestContext']['authorizer']['claims']['iss']直接获取签发者字段,再提取用户池ID。
  3. 若需更直接的标识,可在Authorizer的自定义上下文设置中添加映射规则:
    • 新增上下文参数(如userPoolId),取值设为$context.authorizer.claims.iss或提取后的用户池ID($split($context.authorizer.claims.iss, '/')[2])。
    • 配置完成后,Lambda可通过event['requestContext']['authorizer']['userPoolId']直接拿到标识。

方式2:使用API Gateway映射模板(REST API专属)

  1. 在API Gateway的集成请求中,选择对应Lambda的集成方式,开启映射模板。
  2. 创建application/json类型的映射模板,将用户池标识写入请求体或自定义字段:
{
  "userPoolId": "$split($context.authorizer.claims.iss, '/')[2]",
  "originalBody": $input.json('$')
}
  1. Lambda触发时,可直接从event['userPoolId']获取用户池标识,同时保留原始请求体内容。

三、Lambda(Python)示例代码

def lambda_handler(event, context):
    # 方式1:从授权上下文提取iss字段并解析用户池ID
    iss_claim = event['requestContext']['authorizer']['claims']['iss']
    user_pool_id = iss_claim.split('/')[-1]

    # 方式2:直接获取映射模板传递的userPoolId(如果用了方式2)
    # user_pool_id = event['userPoolId']

    # 根据用户池ID选择对应数据源表
    data_table = f"company_{user_pool_id}_data"
    # 后续业务逻辑...

    return {
        'statusCode': 200,
        'body': f"已切换至数据源表:{data_table}"
    }

注意事项

  • 若单个API端点需要支持多个Cognito用户池的用户访问,需改用Lambda Authorizer替代原生Cognito Authorizer,在Lambda Authorizer中验证多个用户池的token,并将用户池ID写入上下文传递给业务Lambda。
  • 确保Cognito Token的验证逻辑正常,避免非法token绕过认证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:46:22