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

如何通过AWS Lambda的context.identity.cognitoIdentityId获取关联Cognito用户池数据?

获取Cognito用户数据的可行方案

兄弟,我懂你这种抓瞎的感觉——明明Lambda里已经拿到了context.identity.cognitoIdentityId和context.identity.cognitoIdentityPoolId,却不知道怎么把这俩「钥匙」变成用户的具体属性数据对吧?别慌,我给你分享两个实测有效的办法:

方法一:通过AWS SDK API调取完整用户数据

这种方法适合需要实时获取用户最新属性的场景,核心思路是先通过身份ID找到关联的用户池用户ID,再调取用户池的API拿到属性。下面是Node.js的极简示例(用AWS SDK v3):

const { CognitoIdentityClient, LookupDeveloperIdentityCommand } = require("@aws-sdk/client-cognito-identity");
const { CognitoIdentityProviderClient, AdminGetUserCommand } = require("@aws-sdk/client-cognito-identity-provider");

// 初始化客户端,替换成你的AWS区域
const cognitoIdentityClient = new CognitoIdentityClient({ region: "us-east-1" });
const cognitoIdpClient = new CognitoIdentityProviderClient({ region: "us-east-1" });

exports.handler = async (event, context) => {
  // 从上下文拿到你已经验证过的两个ID
  const { cognitoIdentityId, cognitoIdentityPoolId } = context.identity;
  
  try {
    // 第一步:通过身份ID查找关联的用户池信息
    const lookupCmd = new LookupDeveloperIdentityCommand({
      IdentityId: cognitoIdentityId,
      IdentityPoolId: cognitoIdentityPoolId
    });
    const lookupResult = await cognitoIdentityClient.send(lookupCmd);
    
    // 提取用户池ID和用户ID(这里假设用户是通过Cognito用户池认证的)
    const userIdentifier = lookupResult.UserIdentifiers?.[0];
    if (!userIdentifier) {
      return { statusCode: 404, body: "未找到关联的用户池用户" };
    }
    const userPoolId = userIdentifier.ProviderName.split("/")[1];
    const username = userIdentifier.UserId;
    
    // 第二步:调用AdminGetUser获取完整用户属性
    const getUserCmd = new AdminGetUserCommand({
      UserPoolId: userPoolId,
      Username: username
    });
    const userResult = await cognitoIdpClient.send(getUserCmd);
    
    // 把属性转成更友好的键值对格式
    const userAttributes = userResult.UserAttributes.reduce((acc, attr) => {
      acc[attr.Name] = attr.Value;
      return acc;
    }, {});
    
    return { statusCode: 200, body: JSON.stringify(userAttributes) };
  } catch (err) {
    console.error("获取用户数据失败:", err);
    return { statusCode: 500, body: "获取用户属性时出错" };
  }
};

关键注意事项:

  • 给Lambda的IAM角色添加权限:需要允许cognito-identity:LookupDeveloperIdentity和cognito-idp:AdminGetUser这两个动作,否则会报错权限不足。
  • 如果是未认证用户(没关联用户池),这种方法行不通,得用Cognito Sync来存储用户数据。

方法二:直接在身份池映射属性到Lambda上下文

如果你的场景不需要实时获取最新属性,或者想减少API调用次数,可以直接在Cognito身份池里配置映射规则,把用户池的属性直接同步到Lambda的context.identity里。

操作步骤:

  • 打开AWS控制台的Cognito身份池页面,找到你的身份池。
  • 进入「身份验证提供者」->「Cognito用户池」,找到「映射规则」。
  • 点击「添加规则」,比如把用户池的email属性映射到身份池的custom:email,把name映射到custom:name。
  • 保存配置后,下次用户认证时,这些属性就会出现在Lambda的context.identity里,你可以直接通过context.identity['custom:email']获取。

这种方法的好处是不用额外调用API,性能更好,但属性是用户认证时同步的,不是实时最新的。

内容的提问来源于stack exchange,提问作者Codegenic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:55:55