无法在AWS API Gateway HTTP代理请求头中传递$context变量
在AWS API Gateway的请求头中传递Cognito用户名的解决方案
我之前也碰到过类似的问题——请求体里能正常拿到用户名字段,但请求头里就是取不到,大概率是映射语法或者部署环节的小疏漏,给你梳理几个关键的排查和解决步骤:
1. 检查请求头映射的语法是否正确
API Gateway对请求头的映射表达式要求和请求体略有不同,尤其是当claim名称里包含特殊字符(比如cognito:username里的冒号)时,必须用括号加引号的方式取值:
在请求头的映射值里,直接填写:
$context.authorizer.claims['cognito:username']
或者也可以用get方法的写法:
$context.authorizer.claims.get("cognito:username")
注意不要给整个表达式加引号,否则API Gateway会把它当成静态字符串处理,这是很多人容易犯的低级错误!
2. 正确配置并添加请求头映射
具体操作步骤:
- 打开AWS API Gateway控制台,找到你的目标API和对应的资源方法
- 切换到集成请求标签页
- 滚动到HTTP头区域,点击添加头
- 在名称里填你想要的请求头键(比如
X-Cognito-Username) - 映射来自选择映射表达式,然后在值里填入上面的正确表达式
- 保存修改
3. 务必重新部署API
这一步超级容易被忽略!修改映射配置后,必须重新将API部署到对应的阶段,否则所有的配置修改都不会生效。操作:
- 在API Gateway控制台的左侧菜单点击部署API
- 选择你要部署到的阶段,点击部署
4. 验证授权器是否返回了目标Claim
如果上面的步骤都做了还是不行,那得确认你的Cognito授权器确实返回了cognito:username这个claim:
- 用API Gateway的测试功能调用你的方法,在测试结果里查看集成请求的日志,检查
$context.authorizer.claims的结构,确认里面包含cognito:username字段 - 或者检查Cognito用户池的应用客户端设置,确保没有限制
cognito:username这个claim的传递
内容的提问来源于stack exchange,提问作者Abdeali Chandanwala
相关产品推荐
相关产品推荐

