

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

# 身份验证如何与 Amazon Cognito 配合使用
<a name="cognito-how-to-authenticate"></a>

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

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

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

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

**Topics**
+ [使用托管登录进行用户池身份验证](#cognito-authentication-concepts-managed-login)
+ [使用 AWS SDK 进行用户池 API 身份验证和授权](#cognito-authentication-concepts-apiauth)
+ [使用第三方身份提供者进行用户池身份验证](#cognito-authentication-concepts-thirdparty)
+ [身份池身份验证](#cognito-authentication-concepts-identitypools)

## 使用托管登录进行用户池身份验证
<a name="cognito-authentication-concepts-managed-login"></a>

[托管登录](cognito-user-pools-managed-login.md)是一个链接到您的用户池和应用程序客户端的网站。使用它可为用户执行登录、注册和密码重置操作。如果应用程序具有托管登录组件，可用于身份验证，那么就可以减少开发人员实施应用程序所花的时间和精力。应用程序可以跳过进行身份验证的 UI 组件，并在用户的浏览器中调用托管登录网站。

应用程序 JWTs 通过网络或应用程序重定向位置收集用户。实施托管登录的应用程序可以连接到用户池进行身份验证，就好像它们是 OpenID Connect（OIDC）IdP 一样。

托管登录适合这样的模型：应用程序需要 OIDC 授权服务器的身份验证服务，但不立即需要自定义身份验证、身份池集成或用户属性自助服务等功能。当您想使用其中一些高级选项时，您可以使用 SDK 的用户池组件来实施。

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

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

![\[一个流程图，展示了某个应用程序如何提示用户输入并使用托管登录进行登录。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/authentication-managed-login.png)


**托管登录身份验证流程**

1. 一个用户访问您的应用程序。

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

1. 该应用程序将用户引导至用户池域的托管登录页面的登录提示处。

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

1. 用户池验证用户的凭证，并确定用户具有已激活的多重身份验证（MFA）。

1. 托管登录页面提示用户输入 MFA 代码。

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

1. 用户池将用户重定向到应用程序 URL。

1. 该应用程序从托管登录附加到[回调 URL](cognito-terms.md#term-callbackurl) 的 URL 请求参数收集授权代码。

1. 应用程序通过授权代码请求令牌。

1. 令牌端点返回 JWTs 到应用程序。

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

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

1. 用户查看其内容。

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

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

**变体和自定义**  
您可以使用适用于整个用户池的[品牌编辑器](managed-login-brandingeditor.md)来自定义托管登录页面的外观，也可以在任何[应用程序客户端](cognito-terms.md#term-appclient)级别进行自定义。您还可以使用自己的身份提供者、范围、用户属性的访问权限和高级安全配置来[配置应用程序客户端](user-pool-settings-client-apps.md)。

**相关资源**
+ [用户池托管登录](cognito-user-pools-managed-login.md)
+ [作用域、M2M 和资源服务器](cognito-user-pools-define-resource-servers.md)
+ [用户池端点和托管登录参考](cognito-userpools-server-contract-reference.md)

## 使用 AWS SDK 进行用户池 API 身份验证和授权
<a name="cognito-authentication-concepts-apiauth"></a>

AWS 已在[各种开发者框架中为 Amazon Cognito 用户池或 *Amazon Cognito 身份*提供商开发了](cognito-integrate-apps.md#amazon-cognito-authentication-with-sdks)组件。其中内置的方法 SDKs 调用 [Amazon Cognito 用户池 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)。同一个用户池 API 命名空间同时具有用于用户池配置和用户身份验证配置的操作。有关更全面的概述，请参阅[了解 API、OIDC 和托管登录页面身份验证](authentication-flows-public-server-side.md#user-pools-API-operations)。

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

此应用程序不需要实现完整的 OpenID Connect（OIDC）依赖方实施。相反，它具有解码和使用的 JWTs能力。如果您想访问[本地用户](cognito-terms.md#terms-localuser)的全套用户池特征，请在您的开发环境中使用 Amazon Cognito SDK 构建身份验证。

使用自定义 OAuth 作用域的 API 身份验证不太倾向于外部 API 授权。要通过 API 身份验证向访问令牌添加自定义范围，请在运行时使用 [令牌生成前 Lambda 触发器](user-pool-lambda-pre-token-generation.md) 修改令牌。

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

![\[一个流程图，显示一个应用程序，该应用程序提示用户输入并使用 S AWS DK 登录。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/authentication-api.png)


**API 身份验证流程**

1. 一个用户访问您的应用程序。

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

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

1. 应用程序调用发出 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API 请求的方法。该请求会将用户的凭证传递到用户池。

1. 用户池验证用户的凭证，并确定用户具有已激活的多重身份验证（MFA）。

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

1. 应用程序会生成一个提示，指明从用户那里收集 MFA 代码。

1. 应用程序调用发出 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API 请求的方法。请求传递用户的 MFA 代码。

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

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

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

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

1. 用户查看其内容。

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

1. 应用程序确定用户的会话应该持续下去。它使用刷新令牌再次调用该[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)方法并检索新令牌。

**变体和自定义**  
您可以通过额外质询（例如，您自己的自定义身份验证质询）来增强此流程。您可以自动限制以下用户的访问权限：其密码已泄露的用户，或者表现出意料之外的特性，可能表明存在恶意登录尝试的用户。注册、更新用户属性和重置密码的操作流程大致相同。这些流程中的大多数都有重复的公共（客户端）和机密（服务器端）API 操作。

**相关资源**
+ [Amazon Cognito 用户池 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)
+ [用户池入门](getting-started-user-pools.md)
+ [将 Amazon Cognito 身份验证和授权与 Web 和移动应用程序集成](cognito-integrate-apps.md)
+ [了解 API、OIDC 和托管登录页面身份验证](authentication-flows-public-server-side.md#user-pools-API-operations)

## 使用第三方身份提供者进行用户池身份验证
<a name="cognito-authentication-concepts-thirdparty"></a>

使用外部身份提供者（IdP）或*联合身份验证*进行登录的模型与[托管登录](#cognito-authentication-concepts-managed-login)类似。您的应用程序是用户池的 OIDC 依赖方，而您的用户池则充当 IdP 的传递方。IdP 可以是像 Facebook 或 Google 这样的使用者用户目录，也可以是像 Azure 这样的 SAML 2.0 或 OIDC 企业目录。

您的应用程序调用用户池[授权服务器](cognito-terms.md#term-authzserver)上的重定向端点，而不是用户浏览器中的托管登录。从用户的角度来看，他们是选择您的应用程序中的登录按钮。然后，他们的 IdP 提示他们登录。与托管登录身份验证一样，应用程序 JWTs 在应用程序的重定向位置收集。

使用第三方 IdP 进行身份验证适合这样的模型：用户在注册您的应用程序时可能不想使用新密码。对于已实施托管登录身份验证的应用程序，可以更轻松地添加第三方身份验证。实际上，由于您在用户浏览器中调用的内容略有不同，托管登录和第三方会 IdPs 产生一致的身份验证结果。

与托管登录身份验证一样，联合身份验证最适合范围为 OAuth 2.0 的高级授权模型。

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

![\[一个流程图，展示了一个应用程序如何提示用户输入并通过第三方 IdP 来登录。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/authentication-federated.png)


**联合身份验证流程**

1. 一个用户访问您的应用程序。

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

1. 应用程序将用户引导至其 IdP 的登录提示处。

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

1. IdP 验证用户的凭证，并确定用户具有已激活的多重身份验证（MFA）。

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

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

1. IdP 使用 SAML 响应或授权代码将用户重定向至用户池。

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

1. 应用程序从用户池附加到[回调 URL](cognito-terms.md#term-callbackurl) 的 URL 请求参数收集授权代码。

1. 应用程序通过授权代码请求令牌。

1. 令牌端点返回 JWTs 到应用程序。

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

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

1. 用户查看其内容。

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

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

**变体和自定义**  
您可以在[托管登录](#cognito-authentication-concepts-managed-login)中启动联合身份验证，用户可以从分配给[应用程序客户端 IdPs ](cognito-terms.md#term-appclient)的列表中进行选择。托管登录还会提示输入电子邮件地址，并[自动将用户的请求路由到](cognito-user-pools-managing-saml-idp-naming.md)相应的 SAML IdP。使用第三方身份提供者进行身份验证*不需要*用户与托管登录进行交互。您的应用程序可以向用户的[授权服务器请求](cognito-terms.md#term-authorizationserver)添加请求参数，并让用户静默地重定向到其 IdP 登录页面。

**相关资源**
+ [使用第三方身份提供者进行用户池登录](cognito-user-pools-identity-federation.md)
+ [作用域、M2M 和资源服务器](cognito-user-pools-define-resource-servers.md)
+ [用户池端点和托管登录参考](cognito-userpools-server-contract-reference.md)

## 身份池身份验证
<a name="cognito-authentication-concepts-identitypools"></a>

身份池是您应用程序中的一个组件，其功能、API 命名空间和 SDK 模型与用户池有所不同。用户池提供基于令牌的身份验证和授权，而身份池则为 AWS Identity and Access Management (IAM) 提供授权。

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

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

使用身份池进行身份验证适合您使用 IAM 授权对应用程序资产和数据实施访问控制 AWS 服务 的模式。与[用户池中的 API 身份验证](#cognito-authentication-concepts-apiauth)一样，成功的应用程序包括 AWS SDKs 您想要访问的每项服务，以使用户受益。 AWS SDKs 将身份池身份验证中的凭据作为签名应用于 API 请求。

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

![\[一个流程图，展示了一个应用程序如何提示用户输入并通过第三方 IdP 来登录。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/authentication-identity-pool.png)


**身份池身份验证流程**

1. 一个用户访问您的应用程序。

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

1. 应用程序将用户引导至其 IdP 的登录提示处。

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

1. IdP 验证用户的凭证。

1. IdP 将用户重定向至具有 SAML 响应或授权代码的应用程序。

1. 如果用户传递了授权代码，则应用程序会将该代码交换为 IdP 令牌。

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

1. 应用程序调用发出 [GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html)API 请求的方法。应用程序传递用户的令牌或断言并请求身份 ID。

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

1. 身份池返回身份 ID。

1. 应用程序调用发出 [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html)API 请求的方法。应用程序传递用户的令牌或断言并请求 IAM 角色。

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

1. AWS Security Token Service (AWS STS) 响应来自身份池的[AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)请求。响应包含使用 IAM 角色进行临时会话的 API 凭证。

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

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

1. 应用程序将临时证书作为[签名](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html)应用于所需的 API 请求 AWS 服务。

1. IAM 评估凭证中附加到该角色的策略。并将策略与请求进行比较。

1.  AWS 服务 返回请求的数据。

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

1. 用户查看数据。

**变体和自定义**  
要使用用户池来可视化身份验证，请在**发放令牌/断言**步骤之后插入其中一个之前的用户池概述。开发人员身份验证将**请求身份**之前的所有步骤替换为由[开发人员凭证](cognito-terms.md#term-developercredentials)签名的请求。访客身份验证还会直接跳到**请求身份**步骤，不验证身份验证，并返回 [limited-access](iam-roles.md#access-policies-scope-down-services) IAM 角色的凭证。

**相关资源**
+ [Amazon Cognito 身份池](cognito-identity.md)
+ [用户 IAM 角色](identity-pools.md#user-iam-roles)
+ [身份池身份验证流程](authentication-flow.md)