

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

# 使用 Amazon Cognito 用户池对用户进行身份验证
<a name="cognito-user-pools"></a>

Amazon Cognito 用户池是用于 Web 和移动应用程序身份验证和授权的用户目录。从应用程序的角度来看，Amazon Cognito 用户池是 OpenID Connect（OIDC）身份提供者（IdP）。用户池为安全性、身份联合验证、应用程序集成和用户体验自定义添加了多层附加功能。

本章介绍用户如何进行身份验证：注册、登录以及用户池支持的身份验证流程，包括通过外部身份提供商登录。相关任务将在各自的章节中介绍：管理目录中的用户、使用 AWS Lambda 触发器自定义行为以及使用威胁防护保护池。

![大致地概述用户池工作原理的示意图。客户可以使用使用 AWS SDK 构建的应用程序登录，也可以使用用户池中内置的 OpenID Connect (OIDC) IdP 进行登录。用户池还可以统一多个社交身份提供者、OpenID Connect 和 SAML 2.0 身份提供者的登录流程。](https://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/scenario-authentication-cup.png)


**Topics**
+ [功能](#cognito-user-pools-features)
+ [用户池功能计划](cognito-sign-in-feature-plans.md)
+ [使用 Amazon Cognito 用户池进行身份验证](authentication.md)
+ [在成功登录后访问资源](accessing-resources.md)

## 功能
<a name="cognito-user-pools-features"></a>

Amazon Cognito 用户池具有以下功能。

### Sign-up
<a name="cognito-user-pools-sign-up"></a>

Amazon Cognito 用户池具有用户驱动、管理员驱动和编程方法，可将用户配置文件添加到您的用户池。Amazon Cognito 用户池支持以下注册模式。您可以在应用程序中使用这些模型的任意组合。

**重要**  
如果您在用户池中激活用户注册，则互联网上的任何人都可以注册账户并登录您的应用程序。除非您开放您的应用程序供公开注册，否则不要在用户池中启用自助注册。要更改此设置，请在用户池控制台的 “**身份验证 **Sign-up****” 下的菜单中更新**Self-service 注册**，或者更新[ CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html)或 [ UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)API 请求[ AllowAdminCreateUserOnly](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUserConfigType.html#CognitoUserPools-Type-AdminCreateUserConfigType-AllowAdminCreateUserOnly)中的值。  
有关可以在用户池中设置的安全功能的信息，请参阅[使用威胁防护保护用户池](managing-security.md)。

1. 用户可以在应用程序中输入其信息，并创建用户池原生的用户配置文件。您可以调用 API 注册操作在用户池中注册用户。您可以向任何人开放这些注册操作，也可以使用客户密钥或 AWS 凭据对其进行授权。

1. 您可以将用户重定向到第三方 IdP，他们可以授权该第三方 IdP 将其信息传递给 Amazon Cognito。Amazon Cognito 将 OIDC ID 令牌、OAuth 2.0 `userInfo` 数据和 SAML 2.0 断言处理到用户池的用户配置文件中。您可以根据属性映射规则控制您希望 Amazon Cognito 接收的属性。

1. 您可以跳过公开注册或联合注册，根据自己的数据源和架构自行创建用户，方法如下：
   + 直接在 Amazon Cognito 控制台中或使用 API 添加用户。
   + 从 CSV 文件中批量导入用户。
   + 运行 just-in-tim AWS Lambda e 函数，在现有目录中查找每个新用户，并根据该数据填充他们的个人资料。

用户注册后，您可以将他们添加到 Amazon Cognito 在访问令牌和 ID 令牌中列出的组。在将 ID 令牌传递给身份池时，还可以将用户池组链接到 IAM 角色。

**相关主题**
+ [管理用户池中的用户](managing-users.md)
+ [了解 API、OIDC 和托管登录页面身份验证](authentication-flows-public-server-side.md#user-pools-API-operations)
+ [使用 Amazon Cognito 身份提供商的代码示例 AWS 软件开发工具包](service_code_examples_cognito-identity-provider.md)

### Sign-in
<a name="cognito-user-pools-sign-in"></a>

Amazon Cognito 可以是应用程序的独立用户目录和身份提供者（IdP）。您的用户可以通过 Amazon Cognito 托管的托管登录页面进行登录，也可以通过采用 Amazon Cognito 用户池 API 构建的定制用户身份验证服务进行登录。定制前端背后的应用程序层可以使用多种方法中的任何一种来授权后端的请求，以确认有效的请求。

用户可以使用用户名和密码、密钥以及电子邮件和短信一次性密码进行设置和登录。您可以提供包含外部用户目录的合并登录、登录后的多因素身份验证 (MFA)、信任记住的设备以及您设计的自定义身份验证流程。

要使用外部目录（可选择与 Amazon Cognito 内置的用户目录结合使用）登录用户，您可以添加以下集成。

1. 使用 OAuth 2.0 社交登录进行登录并导入客户用户数据。Amazon Cognito 支持通过 OAuth 2.0 登录 Google、Facebook、Amazon 和 Apple。

1. 使用 SAML 和 OIDC 登录进行登录并导入工作和学校用户数据。您也可以将 Amazon Cognito 配置为接受来自任何 SAML 或 OpenID Connect（OIDC）身份提供者（IdP）的声明。

1.  将外部用户配置文件链接到原生用户配置文件。关联的用户可以使用第三方用户身份登录，并获得您分配给内置目录中的用户的访问权限。

**相关主题**
+ [使用第三方身份提供者进行用户池登录](cognito-user-pools-identity-federation.md)
+ [将联合用户与现有用户配置文件关联](cognito-user-pools-identity-federation-consolidate-users.md)

**Machine-to-machine 授权**  
有些会话不是人机互动。您可能需要一个能够通过自动化流程向 API 授权请求的服务账户。要为具有 OAuth 2.0 范围的机器对机器授权生成访问令牌，您可以添加从令牌端点生成[客户端凭证授权](https://www.rfc-editor.org/rfc/rfc6749#section-4.4)的应用程序客户端，或者调用 `GetClientToken` API 操作（无需用户池域）。

**相关主题**
+ [作用域、M2M 和资源服务器](cognito-user-pools-define-resource-servers.md)

### 托管登录
<a name="cognito-user-pools-hosted-ui"></a>

如果您不想构建用户界面，则可以向用户展示自定义的托管登录页面。托管登录是一组用于注册、登录、多重身份验证（MFA）和密码重置的网页。您可以向现有域添加托管登录，也可以在 AWS 子域中使用前缀域名。

托管登录还有另一种选择：经典的托管用户界面，这是设计更简单、功能更少的第一代版本。您可以为用户池域选择一个或另一个——它们不能一起使用。下表比较了这两个选项。


| 功能 | 经典托管用户界面 | 托管登录 | 
| --- | --- | --- | 
| 品牌版本 | 托管用户界面（经典） | 托管登录 | 
| 自定义 | File-based 品牌推广（徽标图片和 CSS 值文件） | 亚马逊 Cognito 控制台中的视觉品牌编辑器 | 
| 功能计划 | 所有套餐，包括精简版 | 必备品和额外内容 | 
| 通行密钥登录 | 不可用 | 可用 | 

**注意**  
经典托管用户界面适用于所有功能计划，包括精简版。托管登录及其品牌编辑器需要 Essentials 或 Plus 功能计划。有关更多信息，请参阅 [用户池功能计划](cognito-sign-in-feature-plans.md)。

要设置托管登录，请按顺序完成以下先决条件：

1. 创建用户池。请参阅[在 Amazon Cognito 控制台中创建新的应用程序](getting-started-user-pools-application.md)。

1. 添加用户池域（前缀域或自定义域）。请参阅[配置用户池域](cognito-user-pools-assign-domain.md)。

1. 创建应用程序客户端，设置其品牌版本并返回网址。请参阅[用户池托管登录](cognito-user-pools-managed-login.md)。

**相关主题**
+ [用户池托管登录](cognito-user-pools-managed-login.md)
+ [配置用户池域](cognito-user-pools-assign-domain.md)

### 威胁防护
<a name="cognito-user-pools-security"></a>

通过多因素身份验证 (MFA)、自适应身份验证和 Web ACL 保护您的用户免受密码猜测、帐户盗用和恶意流量的侵害。 AWS WAF 这些保护措施已包含在中[使用威胁防护保护用户池](managing-security.md)。

### 自定义客户体验
<a name="cognito-user-pools-custom-user-experience"></a>

在注册、登录或个人资料更新的大多数阶段，您可以使用 Lambda 触发器和自定义身份验证流程自定义 Amazon Cognito 处理请求的方式，并为托管登录提供熟悉的外观。请参阅[使用 Lambda 触发器自定义用户池工作流](cognito-user-pools-working-with-lambda-triggers.md)。

### 监控和分析
<a name="cognito-user-pools-monitoring-and-analytics"></a>

Amazon Cognito 用户池记录 API 请求 AWS CloudTrail，将性能指标发布到亚马逊 CloudWatch 日志，并监控消息传输和请求量。请参阅[亚马逊 Cognito 正在登录 AWS CloudTrail](logging-using-cloudtrail.md)。

### Amazon Cognito 身份池集成
<a name="cognito-user-pools-identity-pools-integration"></a>

Amazon Cognito 的另一半是身份池。身份池提供证书，用于授权和监控您的用户向（例如 Amazon DynamoDB 或 Amazon S3）发出的 API 请求。 AWS 服务您可以构建基于身份的访问策略，根据您在用户池中对用户进行分类的方式来保护您的数据。身份池还可以接受来自各种身份提供者的令牌和 SAML 2.0 断言，与用户池身份验证无关。

**相关主题**
+ [访问 AWS 服务 登录后使用身份池](amazon-cognito-integrating-user-pools-with-identity-pools.md)
+ [Amazon Cognito 身份池](cognito-identity.md)