Angular中使用Amplify创建Cognito用户如何设置账户状态为FORCE_CHANGE_PASSWORD
Angular+Amplify实现Cognito用户创建状态为FORCE_CHANGE_PASSWORD的解决方案
状态差异原因
Auth.signUp是面向普通用户的自助注册接口,默认触发用户自确认流程,因此创建后的用户状态为 UNCONFIRMED,需要用户自行验证邮箱/手机号完成确认- Cognito控制台创建用户调用的是管理员侧的
AdminCreateUserAPI,走管理员创建用户的流程,因此默认状态为 FORCE_CHANGE_PASSWORD,要求用户首次登录时修改临时密码
实现方案
方案1(推荐):后端封装管理员创建接口
由于管理员创建用户的操作属于高权限操作,不建议直接在前端暴露权限,因此优先通过后端服务封装逻辑:
- 后端集成AWS SDK,调用
AdminCreateUser接口,示例代码(Node.js为例):
import { CognitoIdentityProviderClient, AdminCreateUserCommand } from "@aws-sdk/client-cognito-identity-provider"; const client = new CognitoIdentityProviderClient({ region: "你的Cognito区域" }); const params = { UserPoolId: "你的用户池ID", Username: username, TemporaryPassword: password, UserAttributes: [ { Name: "name", Value: name }, { Name: "email", Value: email }, { Name: "phone_number", Value: phone_number } ], MessageAction: "SUPPRESS" // 可选,设置为SUPPRESS则不发送默认通知邮件,可自行发送自定义通知 }; const command = new AdminCreateUserCommand(params); const response = await client.send(command);
- 后端接口做好权限校验,仅允许拥有管理员权限的前端用户调用
- Angular端请求你自己的后端接口完成用户创建即可,得到的用户默认就是 FORCE_CHANGE_PASSWORD 状态
方案2(仅内部系统适用):前端直接调用管理员API
如果是内部管理系统,可给当前登录的管理员用户分配对应IAM权限后,前端直接调用AWS SDK接口:
- 先给Cognito管理员角色的IAM策略添加
cognito-idp:AdminCreateUser权限 - Angular项目中安装AWS SDK并调用接口:
import { CognitoIdentityProviderClient, AdminCreateUserCommand } from "@aws-sdk/client-cognito-identity-provider"; // 初始化客户端,Amplify已配置过的话可以直接用Amplify的凭证 const client = new CognitoIdentityProviderClient({ region: "你的区域", credentials: await Auth.currentCredentials() }); const params = { UserPoolId: "你的用户池ID", Username: username, TemporaryPassword: password, UserAttributes: [ { Name: "name", Value: name }, { Name: "email", Value: email }, { Name: "phone_number", Value: phone_number } ] }; const command = new AdminCreateUserCommand(params); const result = await client.send(command);
注意:该方案会在前端暴露管理员操作权限,对外公开的用户系统禁止使用
注意事项
不要尝试修改Auth.signUp的返回参数来变更用户状态,该状态是Cognito侧根据调用的API类型自动设置的,客户端侧无法直接修改,必须调用对应的管理员API才可以实现。
内容的提问来源于stack exchange,提问作者Ashutosh
相关产品推荐
相关产品推荐

