在AWS Amplify Gen2中列出Cognito用户池用户遇Region缺失错误如何解决?
解决Amplify Gen2中列出Cognito用户池用户的问题
先修复你当前的Region缺失错误
你的代码里创建CognitoIdentityProviderClient时未指定用户池所在区域,这是直接报错的原因。另外还有两处问题:按钮onClick绑定错误(onClick={listUsers()}会立即执行函数,应改为onClick={listUsers});更关键的是绝对不要在前端直接调用Cognito Admin级API——前端暴露AWS凭证会带来严重的安全风险。
临时测试用的修复代码(生产环境禁止使用):
import { CognitoIdentityProviderClient, ListUsersCommand } from "@aws-sdk/client-cognito-identity-provider"; // ... 其他代码 ... const listUsers = async () => { // 必须指定用户池所属区域,比如us-east-1 const client = new CognitoIdentityProviderClient({ region: "你的用户池区域" }); const command = new ListUsersCommand({ UserPoolId: "你的用户池ID", }); try { const response = await client.send(command); console.log(response.Users); } catch (err) { console.error("获取用户列表失败:", err); } }; // ... 其他代码 ... // 注意这里不要加括号 <button onClick={listUsers}>获取用户</button> // ... 其他代码 ...
生产环境的正确方案:用Amplify Gen2后端函数处理
Amplify Gen2推荐通过后端Lambda函数调用Cognito Admin API,前端仅调用后端函数,避免敏感凭证泄露。
1. 创建后端Lambda函数
在项目中新增一个处理用户列表的函数,比如getCognitoUsers:
// amplify/functions/getCognitoUsers/handler.ts import { CognitoIdentityProviderClient, ListUsersCommand } from "@aws-sdk/client-cognito-identity-provider"; import type { Handler } from "aws-lambda"; const client = new CognitoIdentityProviderClient({ region: process.env.AWS_REGION }); export const handler: Handler = async (event) => { try { const command = new ListUsersCommand({ UserPoolId: process.env.USER_POOL_ID, // 从环境变量读取用户池ID }); const response = await client.send(command); return { statusCode: 200, body: JSON.stringify(response.Users), }; } catch (err) { console.error("获取用户失败:", err); return { statusCode: 500, body: JSON.stringify({ error: "获取用户列表失败" }), }; } };
然后在amplify/backend.ts中配置函数的环境变量和权限:
// amplify/backend.ts import { defineBackend } from "@aws-amplify/backend"; import { auth } from "./auth/resource"; import { getCognitoUsers } from "./functions/getCognitoUsers/resource"; const backend = defineBackend({ auth, getCognitoUsers, }); // 给Lambda函数注入用户池ID环境变量 backend.getCognitoUsers.resources.lambda.addEnvironment("USER_POOL_ID", backend.auth.resources.userPoolId); // 给Lambda添加访问Cognito用户池的权限 backend.getCognitoUsers.resources.lambda.addToRolePolicy({ Effect: "Allow", Action: "cognito-idp:ListUsers", Resource: backend.auth.resources.userPoolArn, });
2. 前端调用后端函数
在app.tsx中通过Amplify客户端调用这个后端函数:
import { generateClient } from "aws-amplify/api"; import type { Schema } from "../amplify/data/resource"; // 路径根据你的项目调整 const client = generateClient<Schema>(); // ... 其他代码 ... const listUsers = async () => { try { const response = await client.function.getCognitoUsers(); console.log("用户列表:", JSON.parse(response.body)); } catch (err) { console.error("获取用户列表失败:", err); } }; // ... 其他代码 ... <button onClick={listUsers}>获取用户列表</button> // ... 其他代码 ...
用户管理功能扩展
如果需要实现删除用户、修改用户属性等操作,只需在后端函数中添加对应的Cognito API调用(比如AdminDeleteUserCommand、AdminUpdateUserAttributesCommand),并在权限策略中添加对应的Action即可。
内容的提问来源于stack exchange,提问作者Om Patel
相关产品推荐
相关产品推荐

