Amazon Cognito 故障排除
本章提供您在使用 Amazon Cognito 时可能遇到的常见问题的解决方案。Amazon Cognito 的实施可能会面临身份验证流程、用户池配置和身份联合验证设置方面的各种挑战。无论您是在开发新应用程序还是维护现有应用程序,本故障排除指南都将帮助您快速发现和解决常见问题。
自定义域配置错误
在 Amazon Cognito 中配置自定义域名时,您可能会收到错误消息。常见错误包括验证问题、证书问题或域冲突。
Custom domain is not a valid
subdomain
此错误表示父域的 DNS 解析存在问题。Amazon Cognito 不支持顶级域,要求父域具有 DNS A 记录用于验证。
- 问题
-
此错误表示父域的 DNS 解析存在问题。Amazon Cognito 不支持顶级域,要求父域具有 DNS A 记录用于验证。
- 解决方案
-
-
为父域创建 A 记录:您必须在 DNS 配置中为自定义域的父域创建 A 记录。
-
示例:如果您的自定义域是
auth.xyz.yourdomain.com,则父域是xyz.yourdomain.com。如果您要将xyz.yourdomain.com配置为自定义域,则父域为yourdomain.com。 -
父域必须解析为有效的 IP 地址。如果它未指向真实的 IP 地址,则可以使用虚拟 IP 地址,例如
8.8.8.8。
-
-
验证 DNS 传播(可选但推荐):要确保您的 DNS 提供商已传播更改,您可以运行
dig命令。-
如果使用
auth.xyz.yourdomain.com作为自定义域:dig A xyz.yourdomain.com +short -
如果使用
xyz.yourdomain.com作为自定义域:dig A yourdomain.com +short -
该命令应返回您配置的 IP 地址。如果没有,请等到更改已完全传播。
-
-
删除父域 A 记录:在 Amazon Cognito 中成功创建自定义域后,如果父域为虚拟域,则可以删除您为父域创建的 A 记录。
-
有关更多信息,请参阅将您自己的域用于托管 UI。
Domain already associated
with another user pool
自定义域名在所有 AWS 账户和区域中都必须唯一。
- 问题
-
自定义域名在所有 AWS 账户和区域中都必须唯一。
- 解决方案
-
-
要为新用户池使用该域名,必须从当前与其关联的用户池中删除自定义域。
-
删除后等待:自定义域需要一段时间才能从第一个用户池中完全删除。删除后立即使用相同的名称创建新自定义域仍可能导致此错误。请等待几分钟,然后重试。
-
One or more of the CNAMEs that
you provided are already associated with a different resource
创建自定义域时,Amazon Cognito 会创建一个 AWS 托管的 Amazon CloudFront 分发。一个域名只能与一个 Amazon CloudFront 分发结合使用。如果该域名已被用作另一个 Amazon CloudFront 分发的备用域,则会出现此错误。
- 问题
-
创建自定义域时,Amazon Cognito 会创建一个 AWS 托管的 Amazon CloudFront 分发。一个域名只能与一个 Amazon CloudFront 分发结合使用。如果该域名已被用作另一个 Amazon CloudFront 分发的备用域,则会出现此错误。
- 解决方案
-
-
选项 1:为您的 Amazon Cognito 自定义域使用不同的域名。
-
选项 2:如果您为 Amazon Cognito 使用该域名,请不要将其与其他 Amazon CloudFront 分发结合使用。
-
The specified SSL certificate
doesn't exist
Amazon Cognito 使用 Amazon CloudFront,而它要求 AWS Certificate Manager(ACM)证书位于 us-east-1(弗吉尼亚北部)AWS 区域,无论用户池位于哪个区域。
- 问题
-
Amazon Cognito 使用 Amazon CloudFront,而它要求 AWS Certificate Manager(ACM)证书位于
us-east-1(弗吉尼亚北部)AWS 区域,无论用户池位于哪个区域。 - 解决方案
-
-
确保证书区域:确认 ACM 证书位于
us-east-1区域。 -
检查证书有效性:确保所选证书未过期。
-
导入的证书:如果您已将证书导入 ACM,请确保:
-
它由公有证书颁发机构颁发。
-
它包括正确的证书链。
-
-
AWS KMS 策略检查:创建域的 IAM 用户或角色的 AWS Key Management Service(AWS KMS)策略中的显式
deny语句可能会导致此错误。具体而言,请在kms:DescribeKey、kms:CreateGrant或kms:*操作中检查是否存在显式拒绝。
-
Invalid refresh token 错误
- 问题
-
当您尝试通过
AdminInitiateAuth或InitiateAuthAPI 操作使用刷新令牌从 Amazon Cognito 用户池中获取新的访问和 ID 令牌时,您会收到Invalid refresh token错误消息。 - 解决方案
-
根据您的用户池配置和 API 使用情况实施以下故障排除步骤:
-
确保应用程序客户端 ID 一致:调用
AdminInitiateAuth或InitiateAuthAPI 进行令牌刷新时,使用的必须与生成刷新令牌的初始身份验证期间使用的应用程序客户端 ID 完全相同。 -
确认设备:如果您在用户池中启用了设备跟踪,但用户的设备尚未得到确认,则必须先调用 ConfirmDevice API。在用户确认其设备后,您便可以交换刷新令牌。
-
在刷新请求中包含设备密钥:如果已启用设备跟踪,请在使用
REFRESH_TOKEN_AUTH流程时包含唯一的设备密钥作为AuthParameter:{ "AuthFlow": "REFRESH_TOKEN_AUTH", "AuthParameters": { "REFRESH_TOKEN": "example_refresh_token", "SECRET_HASH": "example_secret_hash", // Required if your app client uses a client secret "DEVICE_KEY": "example_device_key" } } -
使用
USER_SRP_AUTH进行设备跟踪:如果您使用设备跟踪,则初始身份验证流程必须是USER_SRP_AUTH。
-
有关更多信息,请参阅使用用户池中的用户设备。
联合身份验证中的无效 SAML 响应错误
用户会在尝试使用 SAML 2.0 联合到 Amazon Cognito 时收到各种 Invalid SAML response 和类似错误。可能会由于属性映射问题、证书问题或配置不匹配而发生这些错误。
Invalid user attributes:
Required attribute
- 问题
-
用户缺少用户池中所需属性的值,或者 IdP 正在尝试删除或更新不可变的属性。
- 解决方案
-
-
检查用户池配置中定义的必需属性。
-
使用浏览器中的网络捕获工具检索 SAML 响应。您可能需要执行 URL 和 base64 解码。请验证该属性是否存在于 SAML 断言中。
-
登录您的身份提供者并查看它发送给 Amazon Cognito 的属性。请验证 IdP 是否配置为使用正确的名称发送必需属性。
-
对于不可变属性,请运行以下 AWS CLI 命令来标识它们:
aws cognito-idp describe-user-pool --user-pool-id USER-POOL-ID --query 'UserPool.SchemaAttributes[?Mutable==`false`].Name'。 -
在您的 IdP 的 SAML 属性映射中,删除所有以不可变 Amazon Cognito 属性为目标的映射。或者,将目标属性更新为不同的可变属性。
-
Invalid SAML response received:
SAML Response signature is invalid
- 问题
-
您的 IdP 已更新其 SAML 签名证书,导致 SAML 响应中的证书与存储在 Amazon Cognito 中的元数据文件不匹配。
- 解决方案
-
-
从您的 IdP 下载最新的元数据文件。
-
在 Amazon Cognito 控制台中,导航到用户池的社交和外部提供商,编辑您的 SAML 提供商,然后将现有元数据文件替换为新下载的文件。
-
Audience restriction 或者Application with identifier not found
- 问题
-
在您的 IdP 中配置了错误的实体 ID,或者断言使用了其他用户池的统一资源名称(URN)。
- 解决方案
-
-
从控制台的概述部分获取您的 Amazon Cognito 用户池 ID。
-
在您的 IdP 的管理控制台中,更新用户池的 SAML 应用程序中的实体 ID。请将实体 ID 配置为匹配格式
urn:amazon:cognito:sp:。将USER_POOL_IDUSER_POOL_ID替换为上一步中的用户池 ID。
-
An error was encountered with the
requested page
- 问题
-
向您的 IdP 注册的断言使用者服务(ACS)URL 配置不正确,或者 IdP 未使用所需的 POST 绑定发送 SAML 响应。
- 解决方案
-
-
在 IdP 的管理控制台中,使用正确的 ACS URL 格式更新应用程序,确保其使用
HTTP POST绑定。 -
默认域格式:
https://cognito-idp.Region.amazonaws.com/your user pool ID/saml2/idpresponse -
自定义域格式:
https://auth.example.com/saml2/idpresponse
-
Invalid relayState from identity
provider
- 问题
-
RelayState参数缺失或无效,或者 IdP 和 Amazon Cognito 之间的 URL 不匹配。 - 解决方案
-
-
对于服务提供商启动(SP 启动)的流程:请始终在您的用户池
/oauth2/authorize端点上启动身份验证。在用户初始访问 Amazon Cognito 时未返回RelayState参数的 SAML 断言不是 SP 启动的有效请求。 -
对于身份提供者启动(IdP 启动)的流程:IdP 必须使用所需格式,在对
/saml2/idpresponse端点的 SAML 断言中包含RelayState参数:redirect_uri=REDIRECT_URI&state=STATE。
-
有关更多信息,请参阅将 SAML 身份提供者与用户池配合使用。
托管登录用户无法选择 MFA 因素
- 问题
-
用户在通过托管登录进行登录时无法选择其首选 MFA 方法,或者系统不会提示他们选择您期望的 MFA 方法。
- 解决方案
-
Amazon Cognito 遵循特定的逻辑,根据用户池设置、用户属性和账户恢复配置来确定用户可以使用哪些 MFA 因素。例如,如果将电子邮件配置为其主要账户恢复方法,则用户无法使用电子邮件 MFA。
要覆盖默认 MFA 因素选择,您可以实施以下任一方法:
-
对于公用应用程序:使用 SetUserMFAPreference 与有效访问令牌来允许用户设置自己的 MFA 首选项
-
对于管理员管理的应用程序:使用 AdminSetUserMFAPreference 与 AWS 凭证来配置用户 MFA 首选项
这两个操作都允许您为个人用户启用或禁用短信、电子邮件和 TOTP MFA 方法,并将一种方法设置为首选。
-
有关更多信息,请参阅向用户池添加 MFA。
无密码和通行密钥用户无法使用 MFA
- 问题
-
使用无密码身份验证方法或通行密钥登录的用户无法添加或使用多重身份验证。
- 解决方案
-
这是预期限制。您可以配置用户池,让用户拥有 MFA 或使用无密码因素登录,但不能同时使用两者。MFA 仅可用于基于密码的身份验证流程。
有关更多信息,请参阅用户池身份验证。
无法通过电子邮件/短信接收密码重置验证码
- 问题
-
在忘记密码工作流程中,用户无法通过电子邮件或短信接收验证码。
- 解决方案
-
无法接收验证码的原因有很多。请按以下核对清单来排查问题:
-
检查用户的垃圾邮件文件夹。
-
确认用户存在于用户池中。
-
验证用户的状态是否不是
FORCE_CHANGE_PASSWORD。在这种情况下,用户由管理员创建,当他们使用临时密码登录时,Amazon Cognito 会提示他们设置密码。 -
检查用户是否具有经过验证的电子邮件或电话号码属性。
-
检查您的短信收发账户支出限额
-
检查您的 Amazon Simple Email Service(Amazon SES)消息发送配额。
-
检查短信和 Amazon SES(如果您的用户池配置为使用 Amazon SES 发送电子邮件)是否都已移出沙盒。如果它们未从沙盒中移出,则未经 Amazon SES 或 AWS End User Messaging SMS验证的电子邮件地址或电话号码将无法接收密码重置码。
-
如果用户有处于活动状态的 MFA 因素,请检查它们是否没有尝试向同一因素生成消息。例如,电子邮件 MFA 处于活动状态的用户无法通过电子邮件发送密码重置代码。
-
有关更多信息,请参阅Amazon Cognito 用户池的电子邮件设置和Amazon Cognito 用户池的短信设置。
SECRET_HASH 错误
- 问题
-
向具有客户端密钥的应用程序客户端发出的身份验证 API 请求返回错误,例如
An error occurred (NotAuthorizedException) when calling the ForgotPassword operation: Client 1example23456789 is configured with secret but SECRET_HASH was not received. - 解决方案
-
您的应用程序必须计算当前用户、应用程序客户端和客户端密钥的
SECRET_HASH。计算方法是:Base64 ( HMAC_SHA256 ( "client secret", "Username" + "Client Id" ) )要获取客户端密钥,您可以:
-
打开 Amazon Cognito 控制台,然后从应用程序客户端菜单导航到您的应用程序客户端。在应用程序客户端信息部分,找到客户端密钥。选择显示客户端密钥,此时将显示您的应用程序客户端密钥。
-
生成 DescribeUserPoolClient 请求。客户端密钥包含在响应中。
-
有关更多信息,请参阅计算密钥哈希值。
Amazon Cognito 控制台为新用户池选择默认配置
- 问题
-
当您在控制台中设置新用户池时,Amazon Cognito 为您选择多个默认设置。创建用户池后,一些设置无法更改。如何做出明智的选择并了解 Amazon Cognito 自动选择了什么?
- 解决方案
-
Amazon Cognito 控制台中的新用户池设置专为快速测试和原型设计而设计。控制台仅为您提供最关键的配置选项,即创建用户池后无法更改的配置选项。Amazon Cognito 自动配置的所有其他设置都可以在稍后修改。
建议采取以下方法:
-
在完善实施时使用控制台创建测试用户池。
-
确定生产配置后,将这些设置应用于测试用户池。
-
使用 DescribeUserPool 和 DescribeUserPoolClient API 操作生成经过测试的配置的 JSON 模板。
-
将这些模板与 AWS SDK、CDK、REST API 或 CloudFormation 等部署工具结合使用,以创建您的生产资源。
-
有关更多信息,请参阅用户池入门。
其他故障排除资源
如需其他故障排除指南和社区提供的解决方案,您还可以探索以下外部资源:
-
AWS re:Post Amazon Cognito 社区
- 浏览社区问题和解决方案 -
AWS 知识中心 Amazon Cognito 文章
- 精选故障排除文章