如何从请求中识别未认证用户的Cognito Identity ID?
如何在Lambda中获取Cognito未认证用户的IdentityId
可行方案
方案1:通过API Gateway映射模板直接传递IdentityId(推荐)
API Gateway本身可以直接获取Cognito用户的IdentityId,无需额外调用STS服务,只需在API的集成请求中配置映射模板,把该值注入到Lambda的event参数里:
- 打开API Gateway控制台,找到目标API及对应的资源/方法
- 进入「集成请求」页面,找到「映射模板」模块
- 添加或编辑对应Content-Type的模板(比如
application/json),写入以下内容:
{ "identityId": "$context.identity.cognitoIdentityId", "headers": "$input.params().header", "body": "$input.json('$')" }
配置完成后,Lambda的event参数中会直接包含identityId字段,你可以通过event['identityId']直接读取目标值。
方案2:通过STS GetCallerIdentity解析IdentityId
如果你已经勾选了API Gateway的「Invoke with caller credentials」,Lambda会使用调用者的Cognito临时凭证执行,此时可以调用sts.getCallerIdentity(),从返回结果的Arn中提取IdentityId:
以下是Python示例代码:
import boto3 def lambda_handler(event, context): sts_client = boto3.client('sts') caller_info = sts_client.get_caller_identity() # 从Arn中拆分出最后一段,即为Cognito IdentityId identity_id = caller_info['Arn'].split('/')[-1] return {"identityId": identity_id}
注意:需要给Lambda的执行角色(或调用者的Cognito未认证角色)添加sts:GetCallerIdentity权限,否则会触发权限报错。
补充说明
- 你之前查看SessionToken无法获取IdentityId是正常的,因为AWS临时会话令牌并非JWT格式,本身不包含用户身份信息,无法直接解码提取。
- 尽量避免在请求中手动携带IdentityId,既增加请求体积,还存在被篡改的风险,上述两种方案都是安全可靠的服务端获取方式。
内容的提问来源于stack exchange,提问作者Matt Saunders
相关产品推荐
相关产品推荐

