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

如何从请求中识别未认证用户的Cognito Identity ID?

如何在Lambda中获取Cognito未认证用户的IdentityId

可行方案

方案1:通过API Gateway映射模板直接传递IdentityId(推荐)

API Gateway本身可以直接获取Cognito用户的IdentityId,无需额外调用STS服务,只需在API的集成请求中配置映射模板,把该值注入到Lambda的event参数里:

  1. 打开API Gateway控制台,找到目标API及对应的资源/方法
  2. 进入「集成请求」页面,找到「映射模板」模块
  3. 添加或编辑对应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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:25:43