如何在旧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
相关产品推荐
相关产品推荐

