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

如何在API Gateway CloudWatch中记录完整Cognito用户信息

解决API Gateway无法获取Cognito cognito:username Claim的问题

我来帮你搞定这个问题——你碰到的情况挺常见,一般和Cognito Token内容、API Gateway授权器配置或者映射模板语法这几个环节有关,咱们一步步排查:

1. 先确认ID Token里确实有cognito:username

先找个JWT解码工具解析你的用户ID Token,检查Payload部分是否存在cognito:username字段。要是这个字段本身就不在Token里,API Gateway肯定拿不到:

  • 这种情况的话,你得检查Cognito用户池的应用客户端配置:确保在用户池的应用客户端中,cognito:username对应的属性被设置为可在ID Token中返回。默认情况下cognito:username是标准属性,应该会被包含,但如果是自定义属性,就得在用户池的“属性映射”里明确添加到ID Token的输出中。

2. 检查API Gateway Cognito授权器的配置

如果Token里有cognito:username,但API Gateway还是拿不到,那得检查你的Cognito授权器设置:

  • 确认授权器关联的是正确的Cognito用户池和应用客户端ID。要是授权器验证的客户端ID和生成Token的客户端ID不匹配,API Gateway可能会过滤掉部分Claims。
  • 确保授权器的Token Validation配置正确,没有错误排除相关Claims。

3. 修正映射模板的语法

你之前试的几种写法可能有语法问题,在Velocity模板里,对于带特殊字符(比如冒号)的Claim键,正确的引用方式是用双引号的括号语法:

$context.authorizer.claims["cognito:username"]

单引号在Velocity里是用于字符串字面量,但访问Map的键时得用双引号。另外也可以试试直接用点语法,但冒号可能导致解析问题,所以括号语法更靠谱。

4. 验证CloudWatch日志的配置

虽然你已经按指南配置了日志,但可以再确认下日志格式是否包含$context.authorizer.claims的完整内容。比如在日志格式里加上$context.authorizer.claims,这样就能看到所有可访问的Claims列表,确认cognito:username是不是真的被API Gateway接收到了。

要是以上步骤都试过还是不行,那得看看是不是用了Lambda授权器而非Cognito原生授权器——这种情况下,你需要在Lambda授权器的返回结果里,把cognito:username添加到context字段中,这样API Gateway才能通过$context.authorizer.claims访问到它。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:08:24