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

AWS API Gateway Cognito授权器为何修改提取的JWT声明格式?

AWS API Gateway Cognito授权器的JWT声明格式转换问题

AWS API Gateway的Cognito授权器会自动验证JWT并解析其负载,将部分声明传递给Lambda集成的event.requestContext.authorizer.claims参数中。这个机制省去了手动提取JWT数据的麻烦,但部分声明的格式会在传递过程中发生未记录的转换,给依赖这些参数的代码(比如本地调试时绕过授权器的逻辑、对比JWT值的测试代码)带来适配困扰。

例如,原始JWT负载如下:

{  
  "sub": "xxx",  
  "cognito:groups": [  
    "group-a",  
    "group-b"  
  ],  
  "email_verified": true,  
  "iss": "https://cognito-idp.eu-west-1.amazonaws.com/xxx",  
  "cognito:username": "xxx",  
  "given_name": "xxx",  
  "origin_jti": "xxx",  
  "aud": "xxx",  
  "event_id": "xxx",  
  "token_use": "id",  
  "auth_time": 1666606318,  
  "exp": 1666692718,  
  "iat": 1666606318,  
  "family_name": "xxx",  
  "jti": "xxx",  
  "email": "xxx"
}

传递到Lambda后的event.requestContext.authorizer.claims变为:

{  
  "sub": "xxx",  
  "cognito:groups": "group-a,group-b",  
  "email_verified": "true",  
  "iss": "https://cognito-idp.eu-west-1.amazonaws.com/xxx",  
  "cognito:username": "xxx",  
  "given_name": "xxx",  
  "origin_jti": "xxx",  
  "aud": "xxx",  
  "event_id": "xxx",  
  "token_use": "id",  
  "auth_time": "1666606318",  
  "exp": "Tue Oct 25 10:11:58 UTC 2022",  
  "iat": "Mon Oct 24 10:11:58 UTC 2022",  
  "family_name": "xxx",  
  "jti": "xxx",  
  "email": "xxx"
}

关键格式变化包括:

  • cognito:groups从字符串数组变为逗号分隔的字符串
  • email_verified从布尔值转为字符串"true"
  • exp和iat从时间戳转为UTC日期字符串
  • auth_time从数字转为字符串

请问:

  1. 是否有Cognito授权器的公开代码仓库可以提交PR来修改此行为?
  2. 有没有其他方法可以改变这种格式转换的行为?

更新(2022/10/24):

找到一段相关文档描述:

在后端Lambda函数的输入中,requestContext对象是键值对映射。每个键是$context变量属性的名称,值是该属性的值。API Gateway可能会向映射中添加新键。根据启用的功能,requestContext映射可能因API而异。例如,在前面的示例中,未指定授权类型,因此不存在$context.authorizer.*或$context.identity.*属性。指定授权类型后,API Gateway会将授权用户信息通过requestContext.identity对象传递给集成端点,如下所示:当授权类型为AWS_IAM时,授权用户信息包含$context.identity.属性。当授权类型为COGNITO_USER_POOLS(Amazon Cognito授权器)时,授权用户信息包含$context.identity.cognito和$context.authorizer.claims.*属性。当授权类型为CUSTOM(Lambda授权器)时,授权用户信息包含$context.authorizer.principalId和其他适用的$context.authorizer.*属性。

这似乎暗示event.requestContext仅支持传递字符串类型的键值对?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:20:29