AWS Cognito cognitoIdentityPoolId与cognitoIdentityId在Lambda授权器中为空问题
我正在尝试使用带联合身份的AWS Cognito用户池(User Pool)与身份池(Identity Pool),已完成以下配置:
- 创建身份池并将Cognito设为其认证提供商
- Cognito集成了Google身份提供商
- 使用Amplify完成注册/登录流程,Amplify已配置身份池与用户池
登录后,身份在身份池中正常创建并关联到用户池中的用户,Amplify会话凭证中能看到有效的identityId与identityPoolId,也能正常调用Cognito同步并交换身份数据。
但通过API Gateway集成的Lambda处理程序存在问题:我使用旧版REST API,采用Lambda Proxy集成,并创建了一个仅将事件输出到日志的Lambda授权器。查看CloudWatch日志时发现identity字段中的关键信息为空:
"identity": { "cognitoIdentityPoolId": null, "accountId": null, "cognitoIdentityId": null, "caller": null, "sourceIp": "185.5.69.158", "principalOrgId": null, "accessKey": null, "cognitoAuthenticationType": null, "cognitoAuthenticationProvider": null, "userArn": null, "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36", "user": null },
我使用Amplify API集成,日志中可见带预签名请求的授权头,请问为何cognitoIdentityPoolId与cognitoIdentityId为空?需要如何配置才能在Lambda授权器中获取身份信息?
核心原因
Lambda授权器里拿不到Cognito身份信息,本质是API Gateway没从预签名请求的凭证里解析出身份池数据,或者授权器配置没开启身份信息传递。
具体修复步骤
设置API Gateway方法的身份验证类型
进入API Gateway控制台,找到目标REST API的对应资源和方法,在「方法请求」里把「身份验证」改成AWS_IAM。因为预签名请求用的是IAM临时凭证,只有开启AWS_IAM验证,API Gateway才会解析请求里的身份数据并传给Lambda授权器。配置Lambda授权器的身份来源与权限
- 在Lambda授权器配置页,把「身份来源」设为
method.request.header.Authorization——这是Amplify预签名请求默认使用的授权头。 - 确认授权器的调用角色权限:既要允许API Gateway调用该Lambda函数,也要给角色添加Cognito身份池相关的权限(比如
cognito-identity:GetId,按需配置)。
- 在Lambda授权器配置页,把「身份来源」设为
检查Amplify API配置
确保Amplify调用API时用的是身份池生成的IAM凭证,在Amplify配置里明确指定授权类型为AWS_IAM:Amplify.configure({ API: { endpoints: [ { name: "MyAPIName", endpoint: "https://xxx.execute-api.region.amazonaws.com/stage", region: "region", authorizationType: "AWS_IAM" } ] } });验证请求与身份池配置
- 确认请求的预签名是用身份池的临时凭证(AccessKeyId、SecretAccessKey、SessionToken)生成的。
- 检查身份池的信任关系,确保允许Cognito用户池的用户获取临时凭证。
内容的提问来源于stack exchange,提问作者Martin Macak

