如何从AWS Cognito用户池按given_name与用户组筛选用户?
解决方案:AWS Cognito 按 given_name 和用户组筛选用户
方案1:组合ListUsersInGroup与ListUsers API,通过用户ID关联筛选
- 先调用
listUsersInGroup获取目标组的所有用户,记录每个用户的Username或Sub(用户唯一ID) - 再调用
listUsers,用Filter参数指定given_name的筛选条件(示例:given_name = "John") - 将两个结果集按用户ID取交集,得到同时满足组和
given_name条件的用户 - 注意处理分页:若组内用户或符合
given_name的用户超过100个,需循环调用API获取全部分页结果
示例代码(JavaScript):
const AWS = require('aws-sdk'); const cognito = new AWS.CognitoIdentityServiceProvider(); async function filterUsersByGroupAndGivenName(userPoolId, groupName, givenName) { // 获取组内所有用户 let groupUsers = []; let nextToken; do { const groupParams = { UserPoolId: userPoolId, GroupName: groupName, NextToken: nextToken }; const groupResult = await cognito.listUsersInGroup(groupParams).promise(); groupUsers = [...groupUsers, ...groupResult.Users]; nextToken = groupResult.NextToken; } while (nextToken); // 获取符合given_name的用户 let nameFilteredUsers = []; nextToken = undefined; do { const userParams = { UserPoolId: userPoolId, Filter: `given_name = "${givenName}"`, NextToken: nextToken }; const userResult = await cognito.listUsers(userParams).promise(); nameFilteredUsers = [...nameFilteredUsers, ...userResult.Users]; nextToken = userResult.NextToken; } while (nextToken); // 取交集 const groupUserIds = new Set(groupUsers.map(u => u.Username)); return nameFilteredUsers.filter(u => groupUserIds.has(u.Username)); }
方案2:同步用户数据到DynamoDB,实现高效查询
- 创建Lambda触发器,在用户创建、更新、加入/退出组时,将用户的
given_name、所属组、Username等关键信息同步到DynamoDB表 - 在DynamoDB表中创建复合索引(比如以
groupName为分区键,givenName为排序键),或全局二级索引,支持按组和given_name的组合查询 - 直接通过DynamoDB的
Query操作(比Scan更高效)获取符合条件的用户
优势:避免多次调用Cognito API,支持大规模用户的快速筛选,扩展性强
方案3:使用Amazon Athena查询Cognito导出数据
- 开启Cognito用户池的数据导出功能,将用户数据定期导出到S3存储桶
- 在Athena中创建外部表,映射S3中的Cognito导出数据
- 编写SQL查询,同时过滤
given_name和组字段(注意解析Cognito导出的组数组结构)
适用场景:不需要实时数据,适合批量分析或离线查询的场景
内容的提问来源于stack exchange,提问作者nev
相关产品推荐
相关产品推荐

