AWS Cognito已配置邮箱登录 邮箱密码认证报错如何解决
修复方案
这个报错的核心原因是Cognito用户池的全局邮箱登录配置不会自动同步到关联的应用客户端,仅开全局开关时,客户端认证逻辑仍会把传入的邮箱值当做Cognito内部用户名匹配,自然匹配不到用户返回账号密码错误,按以下步骤调整配置即可:
- 进入对应Cognito用户池控制台,打开你代码里
<some_client_id>对应的应用客户端配置页,不要在用户池全局配置页修改 - 找到「认证流」配置板块,确认已勾选
ALLOW_USER_PASSWORD_AUTH选项,匹配你代码中使用的USER_PASSWORD_AUTH认证流 - 在同个应用客户端配置页找到登录用户名属性配置,选择「邮箱」作为允许的登录标识,不要仅选「用户名」
- 下拉到属性权限配置板块,确认当前应用客户端拥有
email字段的读取权限,无读取权限时Cognito无法完成邮箱到内部用户ID的映射 - 额外校验:进入测试用户的详情页,确认
email_verified字段值为true,未完成验证的邮箱无法作为登录凭证使用
配置完成后不需要修改现有代码逻辑,AuthParameters中的USERNAME字段直接传入邮箱地址完全符合API规范。如果配置后仍报错,可以先调用AdminGetUser接口传入邮箱地址测试是否能正常返回用户信息,确认映射关系生效,参考测试代码:
import { CognitoIdentityProviderClient, AdminGetUserCommand } from "@aws-sdk/client-cognito-identity-provider"; const cognitoClient = new CognitoIdentityProviderClient({region: "us-east-1"}); // 校验邮箱是否能被识别为有效用户标识 const userInfo = await cognitoClient.send(new AdminGetUserCommand({ UserPoolId: "<替换为你的用户池ID>", Username: "foo@bar.com" })); // 正常返回内部生成的用户UUID即代表映射配置生效 console.log(userInfo.Username);
如果你使用的是2020年之前创建的旧版Cognito用户池,还需要额外在用户池别名策略配置中勾选「邮箱」作为允许的认证别名,新版用户池已将该配置合并到登录属性配置项中,无需额外操作。
内容的提问来源于stack exchange,提问作者Alex Fallenstedt
相关产品推荐
相关产品推荐

