如何从经Amazon Cognito认证的HTTP API Gateway与Lambda调用中获取用户详情
Lambda获取Cognito登录用户身份的实现方法
API Gateway在Cognito Authorizer完成Access Token有效性校验后,会自动把令牌中携带的用户身份信息注入到转发给Lambda的请求事件中,Lambda侧完全不需要重复做令牌验证流程,直接读取即可拿到用户身份。
直接从请求事件读取(零额外调用,性能最优)
这是绝大多数业务场景的首选方案,全程没有额外外部服务调用,基于API Gateway到Lambda的透传上下文即可完成用户识别,几乎无额外性能开销。
根据你对接的API Gateway类型不同,读取的字段路径有区别:
对接REST API 形态的API Gateway:
所有Cognito返回的用户Claims,都挂在事件的requestContext.authorizer.claims路径下,常见可直接读取的字段:sub:用户的永久唯一标识,是最可靠的用户主键,所有业务场景都优先用这个字段关联用户数据email、phone_number:用户注册绑定的联系方式username:用户的登录名cognito:groups:用户所属的权限组列表,可直接用来做接口权限判断- 所有你在User Pool中配置、且开启了令牌返回的自定义用户属性,都会在这个路径下读取到
举个简单的读取示例(Node.js 运行时):
exports.handler = async (event) => { // 读取透传的用户身份信息 const userInfo = event.requestContext.authorizer.claims; const currentUserId = userInfo.sub; const userBindEmail = userInfo.email; // 后续业务逻辑直接基于拿到的用户ID处理即可 }对接HTTP API 形态的API Gateway:
Cognito的Claims存储路径和REST API有区别,需要从事件的requestContext.authorizer.jwt.claims路径下读取,可拿到的字段内容和REST API完全一致,只是路径层级不同。
需获取未包含在令牌内的用户详情时,调用Cognito接口拉取
为了控制Access Token的体积,令牌里只会返回你预先配置允许返回的属性。如果业务需要拿到没开在令牌返回范围内的用户数据(比如用户的详细地址、历史偏好设置这类非核心属性),可以在Lambda里按需调用Cognito接口拉取:
- 给Lambda的执行IAM角色配置对应Cognito User Pool的只读权限
- 直接用之前从事件里读到的用户
sub作为查询主键,调用AdminGetUser接口拉取全量用户属性即可,不需要从请求里提取原始Access Token做查询,避免令牌泄露风险
实际开发的避坑提示
- 千万别用
username或者邮箱、手机号当用户的永久关联主键:这些字段都是支持用户自主修改的,只有sub是用户创建时生成的永久唯一ID,不会随用户信息变更而变化 - 如果发现读不到预期的自定义属性,先去Cognito对应当前应用客户端的配置页,检查目标属性有没有被勾选为“允许在Access令牌中返回”,没勾选的属性不会被API Gateway透传到Lambda
- 完全不需要在Lambda里重复做Access Token的签名校验、有效期校验:API Gateway的Authorizer已经完成了全量的有效性校验,只要请求能路由到Lambda,就说明令牌是完全合法的,重复校验只会增加不必要的计算开销
内容的提问来源于stack exchange,提问作者Rub
相关产品推荐
相关产品推荐

