将您自己的域用于托管 UI
在设置应用程序客户端后,您可以使用适用于 Amazon Cognito 托管 UI 和身份验证服务器端点的自定义域来配置用户池。有了自定义域,用户就可以使用您自己的网址而不是默认的 Amazon Cognito 域来登录您的应用程序。自定义域让您可以使用熟悉的域名,从而提高用户对您的应用程序的信任度,尤其是当根域与托管应用程序的域匹配时。使用自定义域还可以符合组织的安全要求。
自定义域有一些先决条件,包括用户池、应用程序客户端和您拥有的 Web 域。自定义域还需要使用自定义域的 SSL 证书,该证书由美国东部(弗吉尼亚州北部)的 AWS Certificate Manager(ACM)管理。Amazon Cognito 创建一个 Amazon CloudFront 分配,并通过您的 ACM 证书确保传输过程的安全,该分配必须是您的自定义域名的 DNS 别名目标。
在这些要素准备就绪后,您可以通过 Amazon Cognito 控制台或 API 将自定义域添加到用户池。这包括指定域名和 SSL 证书,然后使用提供的别名目标更新 DNS 配置。在进行这些更改后,您可以验证是否可从您的自定义域访问登录页面。
将自定义域添加到用户池
要将自定义域添加到用户池,请在 Amazon Cognito 控制台中指定域名,并提供您使用 AWS Certificate Manager(ACM)管理的证书。在添加域后,Amazon Cognito 提供了一个要添加到 DNS 配置的别名目标。
先决条件
在开始之前,您需要:
-
用户池和应用程序客户端。有关更多信息,请参阅 用户池入门。
-
您拥有的 Web 域。其父域必须具有有效的 DNS A 记录。您可以为该记录分配任何值。父域可以是域的根,也可以是域层次结构中上一级的子域。例如,如果您的自定义域是 auth.xyz.example.com,Amazon Cognito 必须能够将 xyz.example.com 解析为 IP 地址。为了防止意外影响客户基础设施,Amazon Cognito 不支持对自定义域使用顶级域(TLD)。有关更多信息,请参阅域名
。 -
能够为自定义域创建子域。我们建议使用 auth 作为子域。例如:
auth.example.com
。注意
如果您没有通配符证书
,则可能需要为自定义域的子域获取新证书。 -
由 ACM 管理的安全套接字层(SSL)证书。
注意
在请求或导入证书之前,您必须在 ACM 控制台中将AWS区域更改为美国东部(弗吉尼亚北部)。
-
一个应用程序,允许您的用户池授权服务器向用户会话中添加 Cookie。Amazon Cognito 为托管 UI 设置几个必需的 Cookie。这包括
cognito
、cognito-fl
和XSRF-TOKEN
。尽管每个 Cookie 都符合浏览器大小限制,但更改用户池配置可能会导致托管 UI Cookie 变大。像自定义域前面的应用程序负载均衡器(ALB)这样的中间服务可能会强制设定最大请求头大小或总 Cookie 大小。如果您的应用程序还设置了自己的 Cookie,则用户的会话可能会超过这些限制。为避免大小限制冲突,我们建议您的应用程序不要在托管 UI 子域设置 Cookie。 -
更新 Amazon CloudFront 分配所需的权限。为此,您可以为 AWS 账户 中的用户附加以下 IAM policy 声明:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontUpdateDistribution", "Effect": "Allow", "Action": [ "cloudfront:updateDistribution" ], "Resource": [ "*" ] } ] }
有关在 CloudFront 中授权操作的更多信息,请参阅对 CloudFront 使用基于身份的策略(IAM policy)。
Amazon Cognito 最初使用您的 IAM 权限来配置 CloudFront 分配,但分配由 AWS 管理。您无法更改 Amazon Cognito 将其与您的用户池相关联的 CloudFront 分配的配置。例如,您无法更新安全策略中支持的 TLS 版本。
步骤 1:输入自定义域名
您可以使用 Amazon Cognito 控制台或 API 将域添加到用户池。
步骤 2:添加别名目标和子域
在本步骤中,您将通过域名服务器(DNS)服务提供商设置一个别名,该别名指回到上一个步骤中的别名目标。如果您将 Amazon Route 53 用于 DNS 地址解析,请选择使用 Route 53 添加别名目标和子域部分。
-
如果您没有将 Route 53 用于 DNS 地址解析,则必须使用您的 DNS 服务提供商配置工具将上一个步骤中的别名目标添加到域 DNS 记录中。您的 DNS 提供商还需要为您的自定义域设置子域。
-
登录 Route 53 控制台
。如果出现提示,请输入 AWS 凭证。 -
如果您在 Route 53 中没有公共托管区,请创建一个托管区,将根域作为您的自定义域的父域。有关更多信息,请参阅《Amazon Route 53 开发人员指南》中的创建公共托管区。
-
选择创建托管区域。
-
从域名列表中输入自定义域(例如,
myapp.auth.example.com
)的父域(例如,auth.example.com
)。 -
输入托管区域的描述。
-
选择公有托管区域的托管区域类型以允许公共客户端解析您的自定义域。不支持选择私有托管区域。
-
根据需要应用标签。
-
选择创建托管区域。
注意
您还可以为自定义域创建新的托管区,并且使用父托管区中的委托集将查询指向子域托管区。否则,请创建 A 记录。此方法为您的托管区域提供了更大的灵活度和安全性。有关更多信息,请参阅通过 Amazon Route 53 为托管域创建子域
。
-
-
在托管区域页面上,选择您的托管区域的名称。
-
为自定义域的父域添加 DNS 记录(如果您还没有 DNS 记录)。为父域创建 DNS 记录,其属性如下:
-
记录名称:留空。
-
记录类型:
A
。 -
别名:不启用。
-
值:输入您选择的目标。此记录必须解析到某个地址,但记录的值对于 Amazon Cognito 来说并不重要。
-
TTL:设置为您的首选 TTL 或保留为默认值。
-
路由策略:选择简单路由。
-
-
选择创建记录。以下是域
example.com
的示例记录。example.com.
60 IN A198.51.100.1
注意
Amazon Cognito 验证您的自定义域的父域是否有 DNS 记录,以防止意外劫持生产域。如果您没有父域的 DNS 记录,则当您尝试设置自定义域时,Amazon Cognito 将返回错误消息。起始授权(SOA)记录是一条 DNS 记录,但不足以用于父域验证。
-
使用以下属性为您的自定义域添加另一条 DNS 记录:
-
记录名称:用于为
auth.example.com
创建记录的自定义域前缀(例如auth
)。 -
记录类型:
A
。 -
别名:启用。
-
流量路由至:选择 CloudFront 分配的别名。输入您之前记录的别名目标,例如
123example.cloudfront.net
。 -
路由策略:选择简单路由。
-
-
选择创建记录。
注意
新记录可能需要大约 60 秒钟才能传播到所有 Route 53 DNS 服务器。您可以使用 Route 53 GetChange API 方法验证更改是否已传播。
步骤 3:验证登录页面
-
验证登录页面是否可从您的自定义域访问。
通过在浏览器中输入此地址,使用您的自定义域和子域进行登录。这是包含子域
auth
的自定义域example.com
的示例 URL:https://
myapp
.auth
.example.com
/login?response_type=code&client_id=<your_app_client_id>
&redirect_uri=<your_callback_url>
更改自定义域的 SSL 证书
如果需要,您可以使用 Amazon Cognito 更改应用于自定义域的证书。
通常,在使用 ACM 进行常规证书续订后,此操作是不必要的。当您续订 ACM 中的现有证书时,证书的 ARN 保持不变,并且您的自定义域将自动使用新证书。
但是,如果您将现有证书替换为新证书,ACM 将为新证书提供一个新 ARN。要将新证书应用于自定义域,您必须将此 ARN 提供给 Amazon Cognito。
在提供新证书后,Amazon Cognito 需要长达 1 小时才能将它分配给自定义域。
开始前的准备工作
您必须先将证书添加到 Amazon Cognito,然后才能更改 ACM 中的证书。有关更多信息,请参阅《AWS Certificate Manager 用户指南》中的入门。
将您的证书添加到 ACM 时,您必须选择美国东部(弗吉尼亚北部)作为AWS区域。
您可以使用 Amazon Cognito 控制台或 API 更改证书。