身份验证如何与 Amazon Cognito 用户池和身份池配合使用 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

身份验证如何与 Amazon Cognito 用户池和身份池配合使用

当您的客户登录 Amazon Cognito 用户池时,您的应用程序会收到 JSON 网络令牌 (JWT)。

当您的客户使用用户池令牌或其他提供商登录身份池时,您的应用程序将收到临时 Amazon 证书。

通过用户池登录,您可以完全使用 Amazon SDK 实现身份验证和授权。如果您不想构建自己的用户界面 (UI) 组件,则可以调用预构建的 Web UI(托管 UI)或第三方身份提供商 (IdP) 的登录页面。

本主题概述了您的应用程序与 Amazon Cognito 交互以使用 ID 令牌进行身份验证、使用访问令牌进行授权以及使用身份池 Amazon Web Services 凭证进行访问的一些方式。

使用 Amazon SDK 进行用户池 API 身份验证和授权

Amazon 已在各种开发者框架中为 Amazon Cognito 用户池或 Amazon Cognito 身份提供商开发了组件。这些软件开发工具包中内置的方法调用 Amazon Cognito 用户池 API。同一个用户池 API 命名空间具有用于配置用户池和用户身份验证的操作。有关更全面的概述,请参阅使用 Amazon Cognito 用户池 API 和用户池端点

API 身份验证适合您的应用程序具有现有 UI 组件且主要依赖用户池作为用户目录的模型。这种设计将 Amazon Cognito 添加为大型应用程序中的一个组件。它需要编程逻辑来处理复杂的挑战和响应链。

此应用程序不需要实现完整的 OpenID Connect (OIDC) 依赖方实现。相反,它能够解码和使用 JWT。如果您想访问本地用户的全套用户池功能,请在您的开发环境中使用 Amazon Cognito SDK 进行身份验证。

使用自定义 OAuth 范围的 API 身份验证不太倾向于外部 API 授权。要通过 API 身份验证向访问令牌添加自定义范围,请在运行时使用修改令牌令牌生成前 Lambda 触发器

下图说明了 API 身份验证的典型登录会话。

一个流程图,显示一个应用程序,该应用程序提示用户输入并使用 S Amazon DK 登录。
API 身份验证流程
  1. 用户访问您的应用程序。

  2. 他们选择 “登录” 链接。

  3. 他们输入用户名和密码。

  4. 应用程序调用发出 InitiateAuthAPI 请求的方法。该请求会将用户的凭证传递到用户池。

  5. 用户池会验证用户的凭证并确定用户是否已激活多因素身份验证 (MFA)。

  6. 用户池通过请求获取 MFA 代码的质询进行响应。

  7. 应用程序会生成一个提示,从用户那里收集 MFA 代码。

  8. 应用程序调用发出 RespondToAuthChallengeAPI 请求的方法。该请求传递了用户的 MFA 代码。

  9. 用户池验证用户的 MFA 代码。

  10. 用户池使用用户的 JWT 进行响应。

  11. 应用程序解码、验证、存储或缓存用户的 JWT。

  12. 应用程序显示请求的访问控制组件。

  13. 用户查看他们的内容。

  14. 后来,用户的访问令牌已过期,他们请求查看访问控制组件。

  15. 应用程序决定用户的会话应该持续下去。它使用刷新令牌再次调用该InitiateAuth方法并检索新令牌。

变体和自定义

您可以通过其他挑战来扩展此流程,例如,您自己的自定义身份验证挑战。您可以自动限制密码已被泄露,或者其意外登录特征可能表明存在恶意登录尝试的用户的访问权限。注册、更新用户属性和重置密码的操作流程大致相同。这些流程中的大多数都有重复的公共(客户端)和机密(服务器端)API 操作。

使用托管 UI 进行用户池身份验证

托管用户界面是一个链接到您的用户池和应用程序客户端的网站。它可以为您的用户执行登录、注册和密码重置操作。具有用于身份验证的托管用户界面组件的应用程序可能需要较少的开发人员来实现。应用程序可以跳过用户界面组件进行身份验证,并在用户的浏览器中调用托管用户界面。

应用程序使用网络或应用程序的重定向位置收集用户的 JWT。实现托管用户界面的应用程序可以连接到用户池进行身份验证,就好像它们是 OpenID Connect (OIDC) IdP 一样。

托管 UI 身份验证适合这样的模式:应用程序需要授权服务器,但不需要自定义身份验证、身份池集成或用户属性自助服务等功能。当你想使用其中一些高级选项时,你可以使用 SDK 的用户池组件来实现它们。

托管 UI 和第三方 IdP 身份验证模型主要依赖 OIDC 实现,最适合具有 OAuth 2.0 范围的高级授权模型。

下图说明了托管 UI 身份验证的典型登录会话。

一个流程图,显示一个应用程序,该应用程序提示用户输入并使用托管用户界面登录。
托管用户界面身份验证流程
  1. 用户访问您的应用程序。

  2. 他们选择 “登录” 链接。

  3. 该应用程序会将用户引导至托管界面登录提示。

  4. 他们输入用户名和密码。

  5. 用户池会验证用户的凭证并确定用户是否已激活多因素身份验证 (MFA)。

  6. 托管用户界面会提示用户输入 MFA 代码。

  7. 用户输入他们的 MFA 代码。

  8. 托管用户界面将用户重定向到应用程序。

  9. 应用程序从托管 UI 附加到回调 URL 的 URL 请求参数中收集授权码。

  10. 应用程序请求带有授权码的令牌。

  11. 令牌端点将 JWT 返回到应用程序。

  12. 应用程序解码、验证、存储或缓存用户的 JWT。

  13. 应用程序显示请求的访问控制组件。

  14. 用户查看他们的内容。

  15. 后来,用户的访问令牌已过期,他们请求查看访问控制组件。

  16. 应用程序决定用户的会话应该持续下去。它使用刷新令牌从令牌端点请求新令牌。

变体和自定义

您可以在任何应用程序客户端中使用 CSS 自定义托管 UI 的外观。您还可以使用自己的身份提供商、作用域、用户属性的访问权限和高级安全配置来配置应用程序客户端

使用第三方身份提供商进行用户池身份验证

使用外部身份提供商 (IdP) 登录或联合身份验证的模式与托管 UI 类似。您的应用程序是用户池的 OIDC 依赖方,而您的用户池则充当 IdP 的直通方。IdP 可以是像 Facebook 或谷歌这样的消费者用户目录,也可以是 SAML 2.0 或 OIDC 企业目录,比如 Azure。

您的应用程序调用用户池授权服务器上的重定向端点,而不是用户浏览器中的托管用户界面。从用户的角度来看,他们在您的应用程序中选择登录按钮。然后,他们的 IdP 会提示他们登录。与托管 UI 身份验证一样,应用程序在应用程序的重定向位置收集 JWT。

使用第三方 IdP 进行身份验证适合用户在注册您的应用程序时可能不想出新密码的模式。可以毫不费力地将第三方身份验证添加到已实现托管 UI 身份验证的应用程序中。实际上,由于您在用户浏览器中调用的内容存在细微差异,托管用户界面和第三方会 IdPs 产生一致的身份验证结果。

与托管界面身份验证一样,联合身份验证最适合具有 OAuth 2.0 范围的高级授权模型。

下图说明了联合身份验证的典型登录会话。

一个流程图,显示一个应用程序,该应用程序提示用户输入并使用第三方 IdP 登录。
联合身份验证流程
  1. 用户访问您的应用程序。

  2. 他们选择 “登录” 链接。

  3. 该应用程序会引导用户使用其 IdP 进入登录提示。

  4. 他们输入用户名和密码。

  5. IdP 会验证用户的凭证并确定用户已激活多因素身份验证 (MFA)。

  6. IdP 会提示用户输入 MFA 代码。

  7. 用户输入他们的 MFA 代码。

  8. IdP 使用 SAML 响应或授权码将用户重定向到用户池。

  9. 如果用户传递了授权码,则用户池会默默地将该代码交换 IdP 令牌。用户池会验证 IdP 令牌,并使用新的授权码将用户重定向到应用程序。

  10. 应用程序从用户池附加到回调 URL 的 URL 请求参数中收集授权码。

  11. 应用程序请求带有授权码的令牌。

  12. 令牌端点将 JWT 返回到应用程序。

  13. 应用程序解码、验证、存储或缓存用户的 JWT。

  14. 应用程序显示请求的访问控制组件。

  15. 用户查看他们的内容。

  16. 后来,用户的访问令牌已过期,他们请求查看访问控制组件。

  17. 应用程序决定用户的会话应该持续下去。它使用刷新令牌从令牌端点请求新令牌。

变体和自定义

您可以在托管界面中启动联合身份验证,用户可以在其中从分配给应用程序客户端 IdPs 的列表中进行选择。托管用户界面还可以提示输入电子邮件地址,并自动将用户的请求路由到相应的 SAML IdP。使用第三方身份提供商进行身份验证不需要用户与托管 UI 进行交互。您的应用程序可以向用户的授权服务器请求添加请求参数,并让用户静默重定向到其 IdP 登录页面。

身份池认证

身份池是应用程序的一个组件,在函数、API 命名空间和 SDK 模型上与用户池截然不同。用户池提供基于令牌的身份验证和授权,而身份池则为 Amazon Identity and Access Management (IAM) 提供授权。

您可以将一组身份池分配 IdPs 给身份池,并使用这些身份池登录用户。用户池作为身份池紧密集成 IdPs ,为身份池提供了最多的访问控制选项。同时,身份池有多种身份验证选项可供选择。用户池加入 SAML、OIDC、社交、开发者和访客身份源,作为从身份池中获得临时 Amazon 证书的路由。

身份池的身份验证是外部的,它遵循前面说明的用户池流程之一,或者您与另一个 IdP 独立开发的流程。在您的应用程序执行初始身份验证后,它会将证明传递给身份池并接收临时会话作为回报。

使用身份池进行身份验证适合您使用 IAM 授权对应用程序资产和数据实施访问控制 Amazon Web Services 的模式。与用户池中的 API 身份验证一样,成功的应用程序包括您要访问的每项服务的 Amazon SDK,以使用户受益。 Amazon SDK 将身份池身份验证中的凭据作为签名应用于 API 请求。

下图说明了使用 IdP 进行身份池身份验证的典型登录会话。

一个流程图,显示一个应用程序,该应用程序提示用户输入并使用第三方 IdP 登录。
联合身份验证流程
  1. 用户访问您的应用程序。

  2. 他们选择 “登录” 链接。

  3. 该应用程序会引导用户使用其 IdP 进入登录提示。

  4. 他们输入用户名和密码。

  5. IdP 会验证用户的证书。

  6. IdP 使用 SAML 响应或授权码将用户重定向到应用程序。

  7. 如果用户传递了授权码,则应用程序将使用该代码兑换 IdP 令牌。

  8. 应用程序解码、验证、存储或缓存用户的 JWT 或断言。

  9. 应用程序调用发出 GetIdAPI 请求的方法。它传递用户的令牌或断言并请求身份 ID。

  10. 身份池根据配置的身份提供者验证令牌或断言。

  11. 身份池返回一个身份 ID。

  12. 应用程序调用发出 GetCredentialsForIdentityAPI 请求的方法。它传递用户的令牌或断言并请求一个 IAM 角色。

  13. 身份池会生成一个新的 JWT。新的 JWT 包含请求 IAM 角色的声明。身份池根据用户的请求和 IdP 的身份池配置中的角色选择标准来确定角色。

  14. Amazon Security Token Service (Amazon STS) 响应来自身份池的AssumeRoleWithWebIdentity请求。该响应包含带有 IAM 角色的临时会话的 API 证书。

  15. 应用程序存储会话凭证。

  16. 用户在应用程序中执行的操作需要访问受保护的资源。 Amazon

  17. 应用程序将临时证书作为签名应用于所需的 API 请求 Amazon Web Services。

  18. IAM 会评估证书中附加到该角色的策略。它将它们与请求进行比较。

  19. Amazon Web Service 返回请求的数据。

  20. 应用程序在用户界面中呈现数据。

  21. 用户查看数据。

变体和自定义

要使用用户池可视化身份验证,请在问题令牌/断言步骤之后插入之前的用户池概述之一。开发者身份验证将请求身份之前的所有步骤替换为由开发者凭证签名的请求。访客身份验证还会直接跳到请求身份,不验证身份验证,并返回访问受限的 IAM 角色的证书。