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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:35:06