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

如何在旧API Gateway的aws集成中获取Cognito用户池组?

解决旧AWS API Gateway集成中获取Cognito用户池组信息的问题

核心问题分析

你当前使用的是非aws_proxy模式的AWS集成,默认Lambda只会收到POST的JSON负载。之前的映射模板没有正确提取Cognito用户池的授权信息——因为Cognito的用户组、用户名等数据存储在$context.authorizer.claims中,而非你模板里引用的$context.identity相关字段(后者主要用于IAM身份验证,不适用Cognito用户池授权场景)。

解决方案步骤

1. 修改API Gateway映射模板

更新映射模板,在context节点中添加Cognito授权器的claims信息,重点提取用户组和用户名:

##  This template passes through payload, params, stage variables and Cognito auth info to Lambda
#set($allParams = $input.params())
{
"body-json" : $input.json('$'),
"params" : {
#foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
"$type" : {
    #foreach($paramName in $params.keySet())
    "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
        #if($foreach.hasNext),#end
    #end
}
    #if($foreach.hasNext),#end
#end
},
"stage-variables" : {
#foreach($key in $stageVariables.keySet())
"$key" : "$util.escapeJavaScript($stageVariables.get($key))"
    #if($foreach.hasNext),#end
#end
},
"context" : {
    "account-id" : "$context.identity.accountId",
    "api-id" : "$context.apiId",
    "http-method" : "$context.httpMethod",
    "stage" : "$context.stage",
    "source-ip" : "$context.identity.sourceIp",
    "request-id" : "$context.requestId",
    "resource-path" : "$context.resourcePath",
    # 新增Cognito授权核心信息
    "cognito-auth-info": {
        "username": "$util.escapeJavaScript($context.authorizer.claims.username)",
        "user-groups": $context.authorizer.claims['cognito:groups'],
        "user-sub": "$util.escapeJavaScript($context.authorizer.claims.sub)"
    }
}
}

说明:cognito:groups是数组类型,直接保留原格式(不包裹引号)可让Lambda直接读取为数组,避免字符串转数组的额外操作。

2. 在Lambda中读取授权信息

修改后的event对象会包含context.cognito-auth-info节点,仅需新增少量代码读取即可,不影响原有业务逻辑:

# Python示例
def lambda_handler(event, context):
    # 读取Cognito信息
    cognito_info = event['context']['cognito-auth-info']
    username = cognito_info['username']
    user_groups = cognito_info['user-groups']  # 直接获取数组格式的用户组
    
    # 保留原有业务逻辑
    original_payload = event['body-json']
    # ... 原有代码逻辑 ...

3. 验证授权配置

确保API资源已正确关联Cognito用户池授权器:

  • 进入API Gateway控制台,确认对应资源的授权设置为你的Cognito用户池
  • 客户端请求需携带有效的Cognito ID Token,格式为Authorization: Bearer <your-token>

关键注意点

  • 无需切换到aws_proxy模式,完全避免响应格式修改带来的前端适配工作
  • 映射模板仅新增必要字段,保留原有结构,Lambda代码改动量极小
  • 如需其他Cognito claims字段,直接在cognito-auth-info节点下添加"字段名": "$context.authorizer.claims.字段名"即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:57:49