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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  6. 用户池以请求MFA代码的质询作为响应。

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

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

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

  10. 用户池以用户池的回应JWTs。

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

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

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

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

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

变体和自定义

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

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

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

应用程序JWTs通过网络或应用程序重定向位置收集用户。实现托管用户界面的应用程序可以连接到用户池进行身份验证,就好像它们是 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. 令牌端点返回JWTs到应用程序。

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

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

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

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

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

变体和自定义

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

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

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

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

使用第三方 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. 令牌端点返回JWTs到应用程序。

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

  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 SDKs为用户利益访问的每项服务。 Amazon SDKs将身份池身份验证中的凭据作为签名应用于API请求。

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

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

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

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

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

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

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

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

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

  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 Services 服务 返回请求的数据。

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

  21. 用户查看数据。

变体和自定义

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