如何通过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
相关产品推荐
相关产品推荐

