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从数字转为字符串
请问:
- 是否有Cognito授权器的公开代码仓库可以提交PR来修改此行为?
- 有没有其他方法可以改变这种格式转换的行为?
更新(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

