身份验证如何与 Amazon Cognito 配合使用
当您的客户登录 Amazon Cognito 用户池时,您的应用程序会收到 JSON Web 令牌(JWT)。
当您的客户使用用户池令牌或通过另一个提供者登录身份池时,您的应用程序会收到临时 Amazon 凭证。
通过用户池登录,您可以完全使用 Amazon SDK 实现身份验证和授权。如果您不想构建自己的用户界面(UI)组件,则可以调用预构建的 Web UI(托管登录)或第三方身份提供者(IdP)的登录页面。
本主题概述了您的应用程序与 Amazon Cognito 交互以使用 ID 令牌进行身份验证、使用访问令牌进行授权以及使用身份池凭证访问 Amazon Web Services 服务 的一些方式。
使用托管登录进行用户池身份验证
托管登录是一个链接到您的用户池和应用程序客户端的网站。使用它可为用户执行登录、注册和密码重置操作。如果应用程序具有托管登录组件,可用于身份验证,那么就可以减少开发人员实施应用程序所花的时间和精力。应用程序可以跳过进行身份验证的 UI 组件,并在用户的浏览器中调用托管登录网站。
应用程序使用 Web 或应用程序重定向位置收集用户的 JWT。实施托管登录的应用程序可以连接到用户池进行身份验证,就好像它们是 OpenID Connect(OIDC)IdP 一样。
托管登录适合这样的模型:应用程序需要 OIDC 授权服务器的身份验证服务,但不立即需要自定义身份验证、身份池集成或用户属性自助服务等功能。当您想使用其中一些高级选项时,您可以使用 SDK 的用户池组件来实施。
托管登录和第三方 IdP 身份验证模型主要依赖 OIDC 实施,非常适合具有 OAuth 2.0 范围的高级授权模型。
以下示意图说明了托管登录身份验证的典型登录会话。
托管登录身份验证流程
-
一个用户访问您的应用程序。
-
他们选择“登录”链接。
-
该应用程序将用户引导至用户池域的托管登录页面的登录提示处。
-
他们输入用户名和密码。
-
用户池验证用户的凭证,并确定用户具有已激活的多重身份验证(MFA)。
-
托管登录页面提示用户输入 MFA 代码。
-
用户输入他们的 MFA 代码。
-
用户池将用户重定向到应用程序 URL。
-
该应用程序从托管登录附加到回调 URL 的 URL 请求参数收集授权代码。
-
应用程序通过授权代码请求令牌。
-
令牌端点将 JWT 返回给应用程序。
-
应用程序解码、验证、存储或缓存用户的 JWT。
-
应用程序显示请求的访问控制组件。
-
用户查看其内容。
-
后来,用户的访问令牌过期,他们请求查看访问控制组件。
-
应用程序确定用户的会话应该持续下去。应用程序使用刷新令牌从令牌端点请求新令牌。
变体和自定义
您可以使用适用于整个用户池的品牌编辑器来自定义托管登录页面的外观,也可以在任何应用程序客户端级别进行自定义。您还可以使用自己的身份提供者、范围、用户属性的访问权限和高级安全配置来配置应用程序客户端。
使用 Amazon SDK 进行用户池 API 身份验证和授权
Amazon 已在各种开发人员框架中为 Amazon Cognito 用户池或 Amazon Cognito 身份提供者开发了组件。这些 SDK 中内置的方法调用 Amazon Cognito 用户池 API。同一个用户池 API 命名空间同时具有用于用户池配置和用户身份验证配置的操作。有关更全面的概述,请参阅了解 API、OIDC 和托管登录页面身份验证。
API 身份验证适合您的应用程序具有现有 UI 组件且主要依赖用户池作为用户目录的模型。这种设计将 Amazon Cognito 添加为大型应用程序中的一个组件。该设计需要使用编程逻辑来处理复杂的质询和响应链。
此应用程序不需要实现完整的 OpenID Connect(OIDC)依赖方实施。相反,它能够解码和使用 JWT。如果您想访问本地用户的全套用户池特征,请在您的开发环境中使用 Amazon Cognito SDK 构建身份验证。
使用自定义 OAuth 范围的 API 身份验证较少涉及外部 API 授权。要通过 API 身份验证向访问令牌添加自定义范围,请在运行时使用 令牌生成前 Lambda 触发器 修改令牌。
以下示意图说明了 API 身份验证的典型登录会话。
API 身份验证流程
-
一个用户访问您的应用程序。
-
他们选择“登录”链接。
-
他们输入用户名和密码。
-
应用程序调用发出 InitiateAuth API 请求的方法。该请求会将用户的凭证传递到用户池。
-
用户池验证用户的凭证,并确定用户具有已激活的多重身份验证(MFA)。
-
用户池通过请求获取 MFA 代码的质询进行响应。
-
应用程序会生成一个提示,指明从用户那里收集 MFA 代码。
-
应用程序调用发出 RespondToAuthChallenge API 请求的方法。请求传递用户的 MFA 代码。
-
用户池验证用户的 MFA 代码。
-
用户池使用用户的 JWT 进行响应。
-
应用程序解码、验证、存储或缓存用户的 JWT。
-
应用程序显示请求的访问控制组件。
-
用户查看其内容。
-
后来,用户的访问令牌过期,他们请求查看访问控制组件。
-
应用程序确定用户的会话应该持续下去。应用程序使用刷新令牌再次调用 InitiateAuth 方法并检索新令牌。
变体和自定义
您可以通过额外质询(例如,您自己的自定义身份验证质询)来增强此流程。您可以自动限制以下用户的访问权限:其密码已泄露的用户,或者表现出意料之外的特性,可能表明存在恶意登录尝试的用户。注册、更新用户属性和重置密码的操作流程大致相同。这些流程中的大多数都有重复的公共(客户端)和机密(服务器端)API 操作。
使用第三方身份提供者进行用户池身份验证
使用外部身份提供者(IdP)或联合身份验证进行登录的模型与托管登录类似。您的应用程序是用户池的 OIDC 依赖方,而您的用户池则充当 IdP 的传递方。IdP 可以是像 Facebook 或 Google 这样的使用者用户目录,也可以是像 Azure 这样的 SAML 2.0 或 OIDC 企业目录。
您的应用程序调用用户池授权服务器上的重定向端点,而不是用户浏览器中的托管登录。从用户的角度来看,他们是选择您的应用程序中的登录按钮。然后,他们的 IdP 提示他们登录。与托管登录身份验证一样,应用程序在应用程序中的重定向位置收集 JWT。
使用第三方 IdP 进行身份验证适合这样的模型:用户在注册您的应用程序时可能不想使用新密码。对于已实施托管登录身份验证的应用程序,可以更轻松地添加第三方身份验证。实际上,由于在用户浏览器中调用的内容只有微小差异,所以托管登录和第三方 IdP 会产生一致的身份验证结果。
与托管登录身份验证一样,联合身份验证非常适合具有 OAuth 2.0 范围的高级授权模型。
以下示意图说明了联合身份验证的典型登录会话。
联合身份验证流程
-
一个用户访问您的应用程序。
-
他们选择“登录”链接。
-
应用程序将用户引导至其 IdP 的登录提示处。
-
他们输入用户名和密码。
-
IdP 验证用户的凭证,并确定用户具有已激活的多重身份验证(MFA)。
-
IdP 会提示用户输入 MFA 代码。
-
用户输入他们的 MFA 代码。
-
IdP 使用 SAML 响应或授权代码将用户重定向至用户池。
-
如果用户传递了授权码,则用户池会静默地将该代码交换为 IdP 令牌。用户池会验证 IdP 令牌,并使用新的授权代码将用户重定向到应用程序。
-
应用程序从用户池附加到回调 URL 的 URL 请求参数收集授权代码。
-
应用程序通过授权代码请求令牌。
-
令牌端点将 JWT 返回给应用程序。
-
应用程序解码、验证、存储或缓存用户的 JWT。
-
应用程序显示请求的访问控制组件。
-
用户查看其内容。
-
后来,用户的访问令牌过期,他们请求查看访问控制组件。
-
应用程序确定用户的会话应该持续下去。应用程序使用刷新令牌从令牌端点请求新令牌。
变体和自定义
您可以在托管登录中启动联合身份验证,用户可以在这里从分配给应用程序客户端的 IdP 列表中进行选择。托管登录还会提示输入电子邮件地址,并自动将用户的请求路由到相应的 SAML IdP。使用第三方身份提供者进行身份验证不需要用户与托管登录进行交互。您的应用程序可以向用户的授权服务器请求添加请求参数,并让用户静默地重定向到其 IdP 登录页面。
身份池身份验证
身份池是您应用程序中的一个组件,其功能、API 命名空间和 SDK 模型与用户池有所不同。用户池提供基于令牌的身份验证和授权,而身份池则为 Amazon Identity and Access Management(IAM)提供授权。
您可以将一组 IdP 分配给身份池,并使得用户能够通过这些 IdP 来登录。用户池作为身份池 IdP 紧密集成,为身份池提供了更多访问控制选项。同时,身份池有多种身份验证选项可供选择。用户池将 SAML、OIDC、社交、开发人员和访客身份源结合在一起,作为从身份池获取临时 Amazon 凭证的途径。
身份池的身份验证是外部的,它遵循前面说明的其中一个用户池流程,或者您与另一个 IdP 独立开发的流程。在您的应用程序执行初始身份验证后,它会将证明传递给身份池并收到一个临时会话作为返回。
使用身份池进行身份验证适合这样一种模型:使用 IAM 授权对 Amazon Web Services 服务中的应用程序资产和数据实施访问控制。与用户池中的 API 身份验证一样,成功的应用程序包括您想要为用户提供访问的每项服务的 Amazon SDK。AmazonSDK 将身份池身份验证中的凭证作为签名应用于 API 请求。
以下示意图说明了使用 IdP 的身份池身份验证的典型登录会话。
身份池身份验证流程
-
一个用户访问您的应用程序。
-
他们选择“登录”链接。
-
应用程序将用户引导至其 IdP 的登录提示处。
-
他们输入用户名和密码。
-
IdP 验证用户的凭证。
-
IdP 将用户重定向至具有 SAML 响应或授权代码的应用程序。
-
如果用户传递了授权代码,则应用程序会将该代码交换为 IdP 令牌。
-
应用程序解码、验证、存储或缓存用户的 JWT 或断言。
-
应用程序调用发出 GetId API 请求的方法。应用程序传递用户的令牌或断言并请求身份 ID。
-
身份池根据配置的身份提供者验证令牌或断言。
-
身份池返回身份 ID。
-
应用程序调用发出 GetCredentialsForIdentity API 请求的方法。应用程序传递用户的令牌或断言并请求 IAM 角色。
-
身份池会生成一个新的 JWT。新的 JWT 包含请求 IAM 角色的声明。身份池根据用户的请求和 IdP 的身份池配置中的角色选择标准来确定角色。
-
Amazon Security Token Service(Amazon STS)响应来自身份池的 AssumeRoleWithWebIdentity 请求。响应包含使用 IAM 角色进行临时会话的 API 凭证。
-
应用程序存储会话凭证。
-
用户在需要 Amazon 中的访问受保护资源的应用程序中执行操作。
-
应用程序将临时凭证作为签名应用于必需 Amazon Web Services 服务的 API 请求。
-
IAM 评估凭证中附加到该角色的策略。并将策略与请求进行比较。
-
Amazon Web Services 服务 返回请求的数据。
-
应用程序在用户的界面中呈现数据。
-
用户查看数据。
变体和自定义
要使用用户池来可视化身份验证,请在发放令牌/断言步骤之后插入其中一个之前的用户池概述。开发人员身份验证将请求身份之前的所有步骤替换为由开发人员凭证签名的请求。访客身份验证还会直接跳到请求身份步骤,不验证身份验证,并返回 limited-access IAM 角色的凭证。