用户池托管登录 - Amazon Cognito

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

用户池托管登录

您可以选择一个网域来托管用户池的服务。当您添加域名时,Amazon Cognito 用户池将获得以下功能,这些功能统称为托管登录。

  • 一种授权服务器,充当使用 OAuth 2.0 和 OpenID Connect (OIDC) 的应用程序的身份提供者 (IdP)。授权服务器路由身份验证请求、发放和管理 JSON Web 令牌 (JWTs),并提供用户属性信息。

  • 用于登录、注销和密码管理等身份验证操作的 ready-to-use用户界面 (UI)。托管登录页面充当身份验证服务的 Web 前端。

  • SAML 2.0、OIDC、Facebook、Lo IdPs gin with Amazon IdPs、使用苹果登录和谷歌的服务提供商 (SP) 或依赖方 (RP)。

与托管登录共享某些功能的另一个选项是经典的托管用户界面。经典托管用户界面是托管登录服务的第一代版本。托管 UI IdP 和 RP 服务通常与托管登录具有相同的特征,但是登录页面的设计更简单,功能更少。例如,密钥登录在经典托管用户界面中不可用。在精简版功能计划中,经典托管用户界面是用户池域服务的唯一选择。

托管登录页面是一系列 Web 界面,用于用户池中的基本注册、登录、多因素身份验证和密码重置活动。当您想让用户选择登录选项时,它们还会将用户连接到一个或多个第三方身份提供商 (IdPs)。当您想要对用户进行身份验证和授权时,您的应用程序可以在用户的浏览器中调用您的托管登录页面。

您可以通过自定义徽标、背景和样式使托管登录用户体验适合您的品牌。您可以为托管登录用户界面设置两个品牌选项:托管登录的品牌设计器和托管用户界面的托管用户界面(经典)品牌

品牌设计师

Amazon Cognito 控制台中提供了最多的 up-to-date身份验证选项和可视化编辑器,带来了更新的用户体验。

托管用户界面品牌

对于以前使用 Amazon Cognito 用户池的人来说,这是一种熟悉的用户体验。托管 UI 的品牌推广是基于文件的系统。要将品牌应用于托管的用户界面页面,您需要上传徽标图像文件和一个为多个预定的 CSS 样式选项设置值的文件。

品牌设计器并非在用户群的所有功能计划中都可用。有关更多信息,请参阅 用户池功能计划

有关构造对托管登录和托管用户界面服务的请求的更多信息,请参阅用户池端点和托管登录参考

注意

Amazon Cognito 托管登录不支持使用自定义身份验证质询 Lambda 触发器的自定义身份验证

托管登录本地化

在用户交互式页面中,托管登录默认为英语。您可以显示根据您选择的语言进行本地化的托管登录页面。可用的语言是中可用的语言 AWS Management Console。在分发给用户的链接中,添加lang查询参数,如以下示例所示。

https://<your domain>/oauth2/authorize?lang=es&response_type=code&client_id=<your app client id>&redirect_uri=<your relying-party url>

Amazon Cognito 在用户的浏览器中设置一个 cookie,并在用户使用参数进行初始请求后,使用他们的语言偏好。lang设置 Cookie 后,语言选择将保持不变,无需在请求中显示或要求您在请求中包含该参数。例如,用户使用lang=de参数发出登录请求后,他们的托管登录页面将以德语呈现,直到他们清除 Cookie 或使用新的本地化参数(例如lang=en)提出新请求。

本地化仅适用于托管登录。您必须使用 Essentials 或 Plus 功能套餐并已分配域名才能使用托管登录品牌

您的用户在托管登录中所做的选择不适用于自定义电子邮件或短信发送器触发器。实现这些触发器时,必须使用其他机制(例如locale属性)来确定用户的首选语言。

有以下语言可供选择。

托管登录语言
语言 代码
德语 de
English en
西班牙语 es
法语 fr
印度尼西亚语 id
意大利语
日语 ja
韩语 ko
葡萄牙语 pt-BR
中文(简体) zh-CN
中文(繁体) zh-TW

使用设置托管登录 AWS Amplify

如果您使用 AWS Amplify 向网络或移动应用程序添加身份验证,则可以在 Amplify 命令行界面 (CLI) 中设置托管登录页面,在 Amplify 框架中设置库。要向您的应用程序添加身份验证,请将Auth类别添加到您的项目中。然后,在您的应用程序中,使用 Amplify 客户端库对用户池用户进行身份验证。

您可以调用托管登录页面进行身份验证,也可以通过重定向到 IdP 的授权端点联合用户。用户成功通过提供商进行身份验证后,Amplify 会在您的用户池中创建一个新用户,并将该用户的令牌传递给您的应用程序。

以下示例说明 AWS Amplify 如何使用在您的应用程序中设置社交服务提供商的托管登录。

使用 Amazon Cognito 控制台设置托管登录

托管登录和托管 UI 的首要要求是用户池域。在用户池控制台中,导航到用户池的选项卡,然后添加 Cognito 域自定义域。您也可以在创建新用户池的过程中选择域。有关更多信息,请参阅 配置用户池域。当您的用户池中的某个域处于活动状态时,所有应用程序客户端都会在该域上提供公共身份验证页面。

创建或修改用户池域时,需要为域名设置品牌版本。此品牌版本可以选择托管登录或托管用户界面(经典)。您选择的品牌版本适用于在您的域中使用登录服务的所有应用程序客户端。

下一步是从用户池的 “应用程序客户端” 选项卡中创建应用程序客户端。在创建应用程序客户端的过程中,Amazon Cognito 会要求您提供有关您的应用程序的信息,然后提示您选择返回网址。返回网址也称为信赖方 (RP) 网址、重定向 URI 和回调网址。这是您的应用程序运行时所使用的 URL,例如https://www.example.commyapp://example

在用户池中配置具有品牌风格的域和应用程序客户端后,您的托管登录页面就可以在互联网上使用。

查看您的登录页面

在 Amazon Cognito 控制台中,在应用程序客户端菜单下选择应用程序客户端登录页面选项卡中的查看登录页面按钮。此按钮将带您进入用户池域中的登录页面,其中包含以下基本参数。

  • 应用程序客户端 id

  • 授权代码授予请求

  • 对您为当前应用程序客户端激活的所有范围的请求

  • 当前应用程序客户端列表中的第一个回调 URL

当您想要测试托管登录页面的基本功能时,“查看登录页面” 按钮非常有用。您的登录页面将与您分配给用户池域名的品牌版本相匹配。您可以使用其他和修改后的参数自定义登录 URL。在大多数情况下,“查看登录页面” 链接中自动生成的参数并不完全符合您的应用程序的需求。在这些情况下,您必须自定义应用程序在用户登录时调用的 URL。有关登录参数键和值的更多信息,请参阅 用户池端点和托管登录参考

登录网页使用以下 URL 格式。此示例使用 response_type=code 参数请求授权码授予。

https://<your domain>/oauth2/authorize?response_type=code&client_id=<your app client id>&redirect_uri=<your relying-party url>

您可以从用户池的 “域” 菜单中查找您的用户池字符串。在应用程序客户端菜单中,您可以识别应用程序客户端 IDs、其回调 URLs、允许的范围和其他配置。

当您使用自定义参数导航到 /oauth2/authorize 端点时,Amazon Cognito 会将您重定向到 /oauth2/login 端点,或者在您具有 identity_provideridp_identifier 参数时,静默地将您重定向到 IdP 登录页面。

隐式拨款请求示例

您可以使用以下 URL 查看登录网页,以获取隐式代码授权。response_type=token成功登录后,Amazon Cognito 会将用户池令牌返回到您的 Web 浏览器的地址栏。

https://mydomain.us-east-1.amazoncognito.com/authorize?response_type=token&client_id=1example23456789&redirect_uri=https://mydomain.example.com

身份令牌和访问令牌显示为附加到您的重定向 URL 的参数。

以下内容是来自隐式授予请求的示例响应。

https://mydomain.example.com/#id_token=eyJraaBcDeF1234567890&access_token=eyJraGhIjKlM1112131415&expires_in=3600&token_type=Bearer

自定义您的身份验证页面

过去,Amazon Cognito 仅使用经典托管用户界面托管登录页面,这是一种简单的设计,可为身份验证网页提供通用外观。您可以使用徽标图像自定义 Amazon Cognito 用户池,也可以使用指定某些 CSS 样式值的文件调整某些样式。后来,Amazon Cognito 推出了托管登录,这是一项更新的托管身份验证服务。托管登录是品牌设计师更新 look-and-feel的。品牌设计师是一个无代码的可视化编辑器,其选项套件比托管用户界面自定义体验还要多。托管登录还引入了自定义背景图像和深色模式主题。

你可以在用户池中的托管登录和托管用户界面品牌体验之间切换。要了解有关自定义托管登录页面的更多信息,请参阅将品牌应用于托管登录页面

关于托管登录和托管用户界面的注意事项

一小时托管登录和托管用户界面会话 Cookie

当用户使用您的登录页面或第三方提供商登录时,Amazon Cognito 会在他们的浏览器中设置一个 Cookie。使用此 Cookie,用户可以在一小时内使用相同的身份验证方法再次登录。当他们使用浏览器 Cookie 登录时,他们会获得新的令牌,这些令牌持续时间在您的应用程序客户端配置中指定的持续时间内。用户属性或身份验证因素的更改不会影响他们使用浏览器 Cookie 再次登录的能力。

使用会话 Cookie 进行身份验证不会将 Cookie 持续时间重置为额外一小时。如果用户在最近一次成功进行交互式身份验证超过一个小时后尝试访问您的登录页面,则必须重新登录。

确认用户帐户并验证用户属性

对于用户池本地用户,当您将用户池配置为允许 Cognito 自动发送消息进行验证和确认时,托管登录和托管用户界面效果最佳。当您启用此设置时,Amazon Cognito 会向注册的用户发送一条包含确认码的消息。相反,当您确认用户为用户池管理员时,您的登录页面会在注册后显示一条错误消息。在这种状态下,Amazon Cognito 已创建新用户,但无法发送验证消息。您仍然可以确认用户为管理员,但他们可能会在遇到错误后联系您的支持部门。有关管理确认的更多信息,请参阅允许用户在您的应用程序中注册但以用户池管理员身份进行确认

查看您对配置的更改

如果您对页面进行了样式更改,但页面没有立即显示,请等待几分钟,然后刷新页面。

解码用户池令牌

Amazon Cognito 用户池令牌使用算法进行 RS256 签名。您可以使用解码和验证用户池令牌。 AWS Lambda请参阅解码和验证 Amazon Cognito J WT 令牌。 GitHub

AWS WAF 网页 ACLs

您可以将用户池配置为使用 AWS WAF Web 规则保护为您的登录页面提供服务的域名和授权服务器 ACLs。当前,只有当您的托管登录品牌版本为托管用户界面(经典)时,您配置的规则才适用于这些页面。有关更多信息,请参阅 关于 AWS WAF 网络 ACLs 和亚马逊 Cognito 的注意事项

TLS 版本

托管登录和托管用户界面页面在传输过程中需要加密。Amazon Cognito 提供的用户池域要求用户的浏览器协商的最低 TLS 版本为 1.2。自定义域支持 TLS 版本 1.2 的浏览器连接。托管用户界面(经典)不要求自定义域名使用 TLS 1.2,但较新的托管登录要求自定义域和前缀域均使用 TLS 版本 1.2。由于 Amazon Cognito 管理您的域服务的配置,因此您无法修改用户池域的 TLS 要求。

CORS 策略

托管登录和托管用户界面均不支持自定义跨域资源共享 (CORS) 来源策略。CORS 策略将阻止用户在其请求中传递身份验证参数。取而代之的是,在应用程序前端实施 CORS 策略。Amazon Cognito 会向以下终端节点发送请求返回Access-Control-Allow-Origin: *响应标头。

Cookie

托管登录和托管用户界面会在用户的浏览器中设置 Cookie。这些 Cookie 符合某些浏览器的要求,即要求网站不能设置第三方 Cookie。它们的范围仅限于您的用户池端点,包括以下内容:

  • 每个请求有一个 XSRF-TOKEN Cookie。

  • 一个 csrf-state Cookie,用于在重定向用户时保持会话一致性。

  • 一个 cognito 会话 Cookie,用于将成功的登录尝试保留一小时。

  • 一种保留用户在托管登录中对语言本地化的选择的 lang Cookie。

  • 一种在用户在托管登录页面之间导航时保留所需数据的 page-data Cookie。

在 iOS 中,您可以阻止所有 Cookie。此设置与托管登录或托管用户界面不兼容。要与可能启用此设置的用户合作,请使用 AWS SDK 将用户池身份验证构建到原生 iOS 应用程序中。在这种情况下,您可以构建自己的会话存储,该存储不依赖 Cookie。

托管登录版本变更的影响

请考虑添加域名和设置托管登录版本的以下影响。

  • 当您添加带有托管登录或托管用户界面(经典)品牌的前缀域时,登录页面最多可能需要 60 秒钟才可用。

  • 当您添加带有托管登录或托管用户界面(经典)品牌的自定义域名时,最多可能需要五分钟才能显示登录页面。

  • 当您更改域名的品牌版本时,可能需要四分钟的时间才能在新品牌版本中显示您的登录页面。

  • 当您在托管登录和托管用户界面(经典)品牌之间切换时,Amazon Cognito 不会维护用户会话。他们必须使用新界面重新登录。

默认样式

当您在中创建应用程序客户端时 AWS Management Console,Amazon Cognito 会自动为您的应用程序客户端分配品牌风格。当您通过该CreateUserPoolClient操作以编程方式创建应用程序客户端时,不会创建任何品牌风格。在您使用CreateManagedLoginBranding请求创建应用程序客户端之前,托管登录不可用于使用 AWS SDK 创建的应用程序客户端。