设置和使用 Amazon Cognito 托管 UI 和联合身份验证端点 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

设置和使用 Amazon Cognito 托管 UI 和联合身份验证端点

带有域的 Amazon Cognito 用户池是OAuth符合 -2.0 标准的授权服务器和用于身份验证的 ready-to-use 托管用户界面 (UI)。授权服务器路由身份验证请求、发放和管理 JSON Web 令牌 (JWTs),并提供用户属性信息。托管 UI 是一系列 Web 界面,用于处理用户池中的基本注册、登录、多重身份验证和密码重置活动。它也是您与应用程序关联的第三方身份提供商 (IdPs) 进行身份验证的中心中心。当您想要对用户进行身份验证和授权时,应用程序可以调用托管 UI 和授权端点。您可以使用自己的徽标和CSS自定义设置使托管用户界面用户体验与您的品牌相匹配。有关托管 UI 和授权服务器的组件的更多信息,请参阅用户池联合身份验证端点和托管 UI 参考

注意

Amazon Cognito 托管 UI 不支持使用自定义身份验证质询 Lambda 触发器进行自定义身份验证。

使用设置托管用户界面 Amazon Amplify

如果您使用 Amazon Amplify 向 Web 或移动应用程序添加身份验证,则可以使用 Amazon Amplify 框架中的命令行界面 (CLI) 和库来设置托管用户界面。要向您的应用程序添加身份验证,您可以使用将Auth类别 Amazon Amplify CLI添加到您的项目中。然后,在您的客户端代码中,您可以使用这些 Amazon Amplify 库对 Amazon Cognito 用户池中的用户进行身份验证。

您可以显示预先构建的托管用户界面,也可以通过重定向到社交登录提供商(例如 Facebook、Google、Amazon 或 Apple)的 OAuth 2.0 端点联合用户。用户成功通过社交服务提供商进行身份验证后,如果需要,可以在您的用户池中 Amazon Amplify 创建一个新用户,然后将该用户的OIDC令牌提供给您的应用程序。

以下示例说明 Amazon Amplify 如何使用在您的应用程序中使用社交提供商设置托管界面。

使用 Amazon Cognito 控制台设置托管 UI

创建应用程序客户端
  1. 转到 Amazon Cognito 控制台。如果出现提示,请输入您的 Amazon 凭据。

  2. 选择用户池

  3. 从列表中选择一个现有用户池,或创建一个用户池

  4. 选择应用程序集成选项卡。

  5. 选择应用程序客户端下的创建应用程序客户端

  6. 选择应用程序类型公有客户端机密客户端,或者其它公共客户端通常在用户的设备上运行,并使用未经身份验证和令APIs牌身份验证的方式。机密客户端通常在中央服务器上的应用程序上运行,该应用程序具有客户端密钥和API凭据,并使用授权标头和 Amazon Identity and Access Management 凭据对请求进行签名。如果您的使用案例与预配置的应用程序的公有客户端机密客户端应用程序设置不同,请选择其它

  7. 输入应用程序客户端名称

  8. 选择您希望在应用程序客户端中允许的身份验证流程

  9. 配置身份验证流程会话持续时间。这是您的用户在会话令牌过期之前必须完成每个身份验证质询的时间。

  10. (可选)配置令牌的到期时间。

    1. 指定应用程序客户端的刷新令牌的过期时间。默认值为 30 天。您可以将其更改为 1 小时到 10 年之间的任何值。

    2. 指定应用程序客户端的访问令牌的过期时间。默认值为 1 小时。您可以将其更改为 5 分钟到 24 小时之间的任何值。

    3. 指定应用程序客户端的 ID 令牌的过期时间。默认值为 1 小时。您可以将其更改为 5 分钟到 24 小时之间的任何值。

      重要

      如果您使用托管 UI 并将令牌生命周期配置为不到一小时,用户将能够根据其会话 Cookie 持续时间使用令牌,该 Cookie 当前固定在一小时。

  11. 选择生成客户端密钥,让 Amazon Cognito 为您生成一个客户端密钥。客户端密钥通常与机密客户端关联。

  12. 是否为此应用程序客户端选择启用令牌撤消。这会增加令牌的大小。有关更多信息,请参阅撤消令牌

  13. 是否为此应用程序客户端选择防止暴露用户存在的错误消息。Amazon Cognito 将响应不存在的用户的登录请求,并显示一条指出用户名或密码不正确的通用消息。

  14. (可选)为此应用程序客户端配置属性读取和写入权限。您的应用程序客户端有权限读取和写入用户池属性架构的有限子集。

  15. 选择创建

  16. 记下客户端 ID。这将识别注册和登录请求中的应用程序客户端。

配置应用程序
  1. 应用程序集成选项卡的应用程序客户端下,选择您的应用程序客户端。检查当前托管 UI信息。

  2. 在 “允许的回调 URL URL” 下添加回调。回调URL是指用户在成功登录后被重定向到的地方。

  3. 在 “允许@@ 的注URL销” 下添加注URL销。注销URL是指您的用户在注销后被重定向到的地方。

  4. 身份提供商列表中添加至少一个列出的选项。

  5. OAuth2.0 授权类型下,选择授权码授予以返回授权码,然后将其兑换为用户池令牌。由于令牌绝不会直接向终端用户公开,因此它们不太可能被泄露。但是,后端需要自定义应用程序以将授权代码换成用户池令牌。出于安全考虑,我们建议您在移动应用程序中使用授权码授予流程以及代码 Exchange (PKCE) 的 Proof 密钥

  6. OAuth2.0 授权类型下,选择隐式授权,让 Amazon Cognito 将用户池JSON网络令牌 (JWT) 返还给您。当没有可用于将授权代码更换为令牌的后端时,您可以使用此流程。它对于调试令牌也很有帮助。

  7. 您可以同时启用授权代码隐式代码,然后按需使用每个授予。如果未选中授权代码隐式代码授权,并且您的应用程序客户端具有客户端密钥,您可以启用客户端凭证授权。只有在您的应用程序需要代表自己而不是代表用户请求访问令牌时,才选择客户端凭证

  8. 选择您要为此应用程序客户端授权的 OpenID Connect 范围

  9. 选择保存更改

配置域
  1. 导航到用户池的应用程序集成选项卡。

  2. 选择在旁边的操作,然后选择创建自定义域创建 Cognito 域。如果您已配置用户池域,请先选择删除 Cognito 域删除自定义域,然后再创建新的自定义域。

  3. 输入可用的域前缀,将其与 Cognito 域结合使用。有关设置自定义域的信息,请参阅将您自己的域用于托管 UI

  4. 选择创建

查看您的登录页面

在 Amazon Cognito 控制台中,请在应用程序集成选项卡中的应用程序客户端和分析下,选择应用程序客户端配置中的 查看托管 UI 按钮。此按钮会将您转到托管 UI 中的登录页面,其中包含以下基本参数。

  • 应用程序客户端 id

  • 授权代码授予请求

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

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

当您想要测试托管 UI 的基本功能时,查看托管 UI 按钮很有用。您可以使用其他参数和修改后的参数来自定义您的登录URL。在大多数情况下,查看托管 UI 链接的自动生成的参数不完全符合您的应用程序需求。在这些情况下,您必须自定义应用程序在登录用户时调用的。URL有关登录参数键和值的更多信息,请参阅 用户池联合身份验证端点和托管 UI 参考

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

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

您可以从应用程序集成选项卡中检索您的用户池域字符串。在同一个选项卡中,您可以在 “应用程序客户端和分析” 下识别应用程序客户端IDsURLs、其回调、允许的范围以及其他配置。

当您使用自定义参数导航到 /oauth2/authorize 端点时,Amazon Cognito 会将您重定向到 /oauth2/login 端点,或者在您具有 identity_provideridp_identifier 参数时,静默地将您重定向到 IdP 登录页面。有关绕URL过托管 UI 的示例,请参阅SAML在 Amazon Cognito 用户池中启动会话

关于隐式授予的托管 UI 请求示例

您可以查看托管的用户界面登录网页,其中response_type=token包含以下URL隐式代码授权。成功登录后,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 用户池托管 UI 需要了解的事项

托管 UI 和确认用户为管理员

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

查看您对托管 UI 配置所做的更改

如果未立即显示对托管 UI 页面的更改,请等待几分钟,然后刷新页面。

解码用户池令牌

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

托管的用户界面和TLS版本

托管 UI 需要在传输过程中进行加密。Amazon Cognito 提供的用户池域要求最低TLS版本为 1.2。自定义域名支持但不需要 1.2 TLS 版。由于 Amazon Cognito 管理托管 UI 和授权服务器终端节点的配置,因此您无法修改用户池域的TLS要求。

托管用户界面和CORS政策

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

托管用户界面和授权服务器 Cookie

Amazon Cognito 用户池终端节点在用户的浏览器中设置 Cookie。这些 Cookie 符合某些浏览器的要求,即网站不设置第三方 Cookie。它们的作用域仅限于您的用户池端点,包括以下内容:

  • 每个请求都有 XSRF-TOKEN cookie。

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

  • 一种cognito会话 Cookie,可将成功的登录尝试保存一小时。