

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

# 使用 Amazon Cognito 用户池进行身份验证
<a name="authentication"></a>

Amazon Cognito 包含多种对用户进行身份验证的方法。用户可以使用 WebAuthn 密码和密钥登录。Amazon Cognito 可以通过电子邮件或短信向他们发送一次性密码。您可以实现 Lambda 函数，以编排您自己的质询与响应序列。这些是*身份验证流程*。在身份验证流程中，用户提供密钥，然后 Amazon Cognito 会验证该密钥，然后发放 JSON 网络令牌 (JWTs) 供应用程序使用 OIDC 库进行处理。本章将介绍如何在不同的应用程序环境中，为您的用户池和应用程序客户端配置各种身份验证流程。您将了解使用托管登录的托管登录页面的选项，以及在 AWS SDK 中构建自己的逻辑和前端的选项。

所有用户池（无论您是否具有域）都可以在用户池 API 中对用户进行身份验证。如果您向用户池添加域，则可以使用[用户池端点](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)。用户池 API 支持针对 API 请求的各种授权模型和请求流程。

为了验证用户的身份，Amazon Cognito 支持多种身份验证流程，这些流程除了密码之外，还结合了其他类型的质询，例如电子邮件和短信一次性密码以及通行密钥。

**Topics**
+ [实现身份验证流程](#authentication-implement)
+ [有关用户池身份验证的需知信息](#authentication-flow-things-to-know)
+ [身份验证会话示例](#amazon-cognito-user-pools-authentication-flow)
+ [为托管登录配置身份验证方法](authentication-flows-selection-managedlogin.md)
+ [在中管理身份验证方法 AWS SDKs](authentication-flows-selection-sdk.md)
+ [身份验证流程](amazon-cognito-user-pools-authentication-flow-methods.md)
+ [API 和 SDK 身份验证的授权模型](authentication-flows-public-server-side.md)

## 实现身份验证流程
<a name="authentication-implement"></a>

无论您是实现[托管登录](authentication-flows-selection-managedlogin.md)，还是使用用于身份验证的 S AWS DK 的[自定义应用程序前端](authentication-flows-selection-sdk.md)，都必须针对要实现的身份验证类型配置应用程序客户端。以下信息介绍了如何在[应用程序客户端](user-pool-settings-client-apps.md)和应用程序中设置身份验证流程。

------
#### [ App client supported flows ]

您可以在 Amazon Cognito 控制台中为应用程序客户端配置支持的流程，也可以使用软件开发工具包中的 API 来配置支持的流程。 AWS 在完成应用程序客户端的配置以支持这些流程后，即可在您的应用程序中部署它们。

以下过程展示了如何使用 Amazon Cognito 控制台为应用程序客户端配置可用的身份验证流程。

**为应用程序客户端配置身份验证流程（使用控制台）**

1. 登录 AWS 并导航到 [Amazon Cognito 用户池控制台](https://console.aws.amazon.com/cognito/v2/idp)。选择一个用户池或新建一个。

1. 在您的用户池配置中，选择**应用程序客户端**菜单。选择一个应用程序客户端或新建一个。

1. 在**应用程序客户端信息**下，选择**编辑**。

1. 在**应用程序客户端流程**下，选择要支持的身份验证流程。

**为应用程序客户端配置身份验证流程（使用 API/SDK）**  
要使用 Amazon Cognito API 为应用程序客户端配置可用的身份验证流程，请在[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-ExplicitAuthFlows)或[UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html#CognitoUserPools-UpdateUserPoolClient-request-ExplicitAuthFlows)请求`ExplicitAuthFlows`中设置值。以下是为客户端预置安全远程密码（SRP）和基于选择的身份验证的示例。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_AUTH",
   "ALLOW_USER_SRP_AUTH
]
```

配置应用程序客户端支持的流程时，您可以指定以下选项和 API 值。


**应用程序客户端流程支持**  

| 身份验证流程 | 兼容性 | 控制台 | API  | 
| --- | --- | --- | --- | 
| [基于选择的身份验证](authentication-flows-selection-sdk.md#authentication-flows-selection-choice) | 服务器端、客户端 | 登录时选择身份验证类型 | ALLOW\$1USER\$1AUTH | 
| [使用永久密码登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password) | 客户端 | 使用用户名和密码登录 | ALLOW\$1USER\$1PASSWORD\$1AUTH | 
| [使用永久密码和安全有效载荷登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp) | 服务器端、客户端 | 使用安全远程密码（SRP）登录 | ALLOW\$1USER\$1SRP\$1AUTH | 
| [刷新令牌](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-refresh) | 服务器端、客户端 | 从现有的经过身份验证的会话中获取新的用户令牌 | ALLOW\$1REFRESH\$1TOKEN\$1AUTH | 
| [服务器端身份验证](authentication-flows-public-server-side.md#amazon-cognito-user-pools-server-side-authentication-flow) | 服务器端 | 使用服务器端管理凭证登录 | ALLOW\$1ADMIN\$1USER\$1PASSWORD\$1AUTH | 
| [自定义身份验证](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-custom) | 服务器端和客户端定制应用程序。与托管登录不兼容。 | 通过 Lambda 触发器使用自定义身份验证流程登录 | ALLOW\$1CUSTOM\$1AUTH | 

------
#### [ Implement flows in your application ]

托管登录会自动将您配置的身份验证选项显示在登录页面中。在定制的应用程序中，需通过声明初始身份验证流程来启动身份验证。
+ 要为用户从一系列流程选项中进行选择，请使用 `USER_AUTH` 流程声明[基于选择的身份验证](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)。该流程提供了客户端身份验证流程中不可用的身份验证方法，例如[通行密钥](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)和[无密码](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)身份验证。
+ 要预先选择身份验证流程，请使用应用程序客户端中可用的任何其他流程来声明[基于客户端的身份验证](authentication-flows-selection-sdk.md#authentication-flows-selection-client)。

当用户登录时，您的[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow)或[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthFlow)请求的正文必须包含一个`AuthFlow`参数。

基于选择的身份验证：

```
"AuthFlow": "USER_AUTH"
```

使用 SRP 的基于客户端的身份验证：

```
"AuthFlow": "USER_SRP_AUTH"
```

------

## 有关用户池身份验证的需知信息
<a name="authentication-flow-things-to-know"></a>

在使用 Amazon Cognito 用户池设计身份验证模型时，请考虑以下信息。

**托管登录与托管 UI 中的身份验证流程**  
[托管登录](cognito-user-pools-managed-login.md)提供的身份验证选项比经典托管 UI 更多。例如，无密码身份验证和通行密钥身份验证仅在托管登录中可用。

**自定义身份验证流程仅在 AWS SDK 身份验证中可用**  
您无法在托管登录或经典托管 UI 中执行*自定义身份验证流程*，也无法[使用 Lambda 触发器进行自定义身份验证](user-pool-lambda-challenge.md)。自定义身份验证可在使用进行[身份验证时使用 AWS SDKs](authentication-flows-selection-sdk.md)。

**通过外部身份提供者（IdP）登录的托管登录**  
在使用[身份验证](authentication-flows-selection-sdk.md)时，您无法通过[第三方 IdPs](cognito-user-pools-identity-federation.md)登录用户 AWS SDKs。您必须实现托管登录或经典托管用户界面，重定向到 IdPs，然后在应用程序中使用 OIDC 库处理生成的身份验证对象。有关托管登录的更多信息，请参阅[用户池托管登录](cognito-user-pools-managed-login.md)。

**无密码身份验证对其他用户功能的影响**  
在用户池和应用程序客户端中激活使用[一次性密码](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)或[通行密钥](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)的无密码登录，会影响用户的创建和迁移。当无密码登录启用时：  

1. 管理员无需密码即可创建用户。默认的邀请消息模板将不再包含 `{###}` 密码占位符。有关更多信息，请参阅 [以管理员身份创建用户账户](how-to-create-user-accounts.md)。

1. 对于基于 SDK 的[SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html)操作，用户在注册时无需提供密码。而在托管登录和托管 UI 中，即使允许无密码身份验证，在注册页面中仍会要求用户输入密码。有关更多信息，请参阅 [注册并确认用户账户](signing-up-users-in-your-app.md)。

1. 从 CSV 文件导入的用户，只要其属性中包含可用于无密码登录选项的电子邮件地址或电话号码，即可立即使用无密码方式登录，而无需重置密码。有关更多信息，请参阅 [通过 CSV 文件将用户导入用户池中](cognito-user-pools-using-import-tool.md)。

1. 无密码身份验证不会调用[用户迁移 Lambda 触发器](user-pool-lambda-migrate-user.md)。

1. 使用一次性密码 (OTP) 第一因素登录的用户无法在会话中添加[多重身份验证 (MFA)](user-pool-settings-mfa.md) 因素。如果配置了带有用户验证功能的密钥，则可以满足 MFA 要求。`MULTI_FACTOR_WITH_USER_VERIFICATION`

**Passkey 依赖方 URLs 不能出现在公共后缀列表中**  
您可以使用自己拥有的域名（例如 `www.example.com`）作为通行密钥配置中的依赖方（RP）ID。此配置旨在支持运行在您自有域上的定制应用程序。[公共后缀列表](https://publicsuffix.org/)（PSL）包含受保护的高层级域。当您尝试将 RP URL 设置为 PSL 中的域时，Amazon Cognito 会返回错误。

**Topics**
+ [身份验证会话流程持续时间](#authentication-flow-session-duration)
+ [失败登录尝试的锁定行为](#authentication-flow-lockout-behavior)

### 身份验证会话流程持续时间
<a name="authentication-flow-session-duration"></a>

根据用户池的功能，您的应用程序可能需要在从 Amazon Cognito 获取令牌之前，对 `InitiateAuth` 和 `RespondToAuthChallenge` 进行多次质询响应。Amazon Cognito 在对每个请求的响应中都包含一个会话字符串。要将您的 API 请求合并到身份验证流程中，请在每个后续请求中包含来自上一个请求的响应中的会话字符串。默认情况下，在会话字符串过期之前，您的用户有三分钟时间完成每项质询。要调整此时段，请更改您的应用程序客户端的 **Authentication flow session duration**（身份验证流程会话持续时间）。以下过程介绍如何在应用程序客户端配置中更改此设置。

**注意**  
**身份验证流程会话持续时间**设置适用于使用 Amazon Cognito 用户池 API 进行身份验证。托管登录将多重身份验证的会话持续时间设置为 3 分钟，并将密码重置验证码的会话持续时间设置为 8 分钟。

------
#### [ Amazon Cognito console ]

**配置应用程序客户端身份验证流程会话持续时间（AWS 管理控制台）**

1. 在您的用户池中的**应用程序集成**选项卡上，从**应用程序客户端和分析**容器中选择您的应用程序客户端的名称。

1. 在**应用程序客户端信息**容器中选择**编辑**。

1. 将**身份验证流程会话持续时间**的值更改为短信和电子邮件 MFA 验证码所需的有效期，以分钟为单位。这还会更改任何用户在您的应用程序客户端中必须完成任何身份验证质询的时间。

1. 选择**保存更改**。

------
#### [ User pools API ]

**配置应用程序客户端身份验证流程会话持续时间 (Amazon Cognito API)**

1. 使用 `DescribeUserPoolClient` 请求中您的现有用户池设置准备 `UpdateUserPoolClient` 请求。您的 `UpdateUserPoolClient` 请求必须包含所有现有的应用程序客户端属性。

1. 将 `AuthSessionValidity` 的值更改为 SMS MFA 代码所需的有效期，以分钟为单位。这还会更改任何用户在您的应用程序客户端中必须完成任何身份验证质询的时间。

------

有关应用程序客户端的更多信息，请参阅[特定于应用程序的应用程序客户端设置](user-pool-settings-client-apps.md)。

### 失败登录尝试的锁定行为
<a name="authentication-flow-lockout-behavior"></a>

当用户连续五次输入错误密码尝试登录时（无论这些请求是通过未经身份验证的 API 操作还是通过 IAM 授权的 API 操作发起的），Amazon Cognito 会将该用户锁定一秒钟。然后，每多一次失败的尝试，锁定持续时间将增加一倍，最长约为 15 分钟。

在锁定期内进行的尝试会产生 `Password attempts exceeded` 异常，不会影响后续锁定期的持续时间。对于累计 *n* 次的失败登录尝试（不包括 `Password attempts exceeded` 异常），Amazon Cognito 会将您的用户锁定 *2^(n-5)* 秒。要将锁定重置为其 *n=0* 初始状态，用户必须在锁定期到期后才能成功登录，或者在锁定后连续 15 分钟的任何时间内都不得发起任何登录尝试。此行为随时可能会发生变化。此行为不适用于自定义质询，除非它们还执行基于密码的身份验证。

## 身份验证会话示例
<a name="amazon-cognito-user-pools-authentication-flow"></a>

下图和 step-by-step指南说明了用户登录应用程序的典型场景。示例应用程序向用户提供多种登录选项。用户通过输入凭证选择其中一种，随后提供额外的身份验证因素，最终完成登录。

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


设想一个应用程序，其登录页面允许用户通过用户名和密码登录、请求通过电子邮件发送的一次性验证码，或选择指纹验证选项。

1. **登录提示**：您的应用程序显示一个主页，其中包含一个*登录*按钮。

1. **请求登录**：用户选择*登录*。您的应用程序从 Cookie 或缓存中检索其用户名，或提示其输入用户名。

1. **请求选项**：您的应用程序请求用户的登录选项，方法是使用 `USER_AUTH` 流程发起 `InitiateAuth` API 请求，获取用户的可用登录方式。

1. **发送登录选项**：Amazon Cognito 返回 `PASSWORD`、`EMAIL_OTP` 和 `WEB_AUTHN`。该响应包含一个会话标识符，供您在下一个响应中回传。

1. **显示选项**：您的应用程序显示 UI 元素，供用户选择输入用户名和密码、获取一次性验证码，或扫描指纹。

1. **选择 option/Enter 凭据**：用户输入其用户名和密码。

1. **发起身份验证**：您的应用程序通过 `RespondToAuthChallenge` API 请求提交用户的登录信息，确认使用用户名密码进行登录，并提供相应的用户名和密码。

1. **验证凭证**：Amazon Cognito 确认用户提供的凭证。

1. **额外质询**：该用户已配置使用于身份验证器应用程序进行多重身份验证。Amazon Cognito 返回 `SOFTWARE_TOKEN_MFA` 质询。

1. **质询提示**：您的应用程序显示一个表单，请求用户输入其身份验证器应用程序生成的基于时间的一次性密码（TOTP）。

1. **回答质询**：用户提交该 TOTP。

1. **响应质询**：您的应用程序在另一个 `RespondToAuthChallenge` 请求中提供用户的 TOTP。

1. **验证质询响应**：Amazon Cognito 确认用户提交的验证码，并确定您的用户池未针对当前用户配置额外的质询。

1. **发行令牌**：Amazon Cognito 会返回 ID、访问权限和刷新 JSON 网络令牌 () JWTs。用户的初始身份验证完成。

1. **存储令牌**：您的应用程序缓存用户的令牌，以便后续引用用户数据、授权资源访问，并在令牌过期时进行更新。

1. **呈现授权内容**：您的应用程序根据用户的身份和角色判断其资源访问权限，并提供相应的应用程序内容。

1. **访问内容**：用户已登录并开始使用该应用程序。

1. **使用过期令牌请求内容**：稍后，用户请求一个需要授权的资源。但用户缓存的令牌已过期。

1. **刷新令牌**：您的应用程序使用用户保存的刷新令牌发起 `InitiateAuth` 请求。

1. **发行令牌**：亚马逊 Cognito 会返回新的 ID 和访问权限。 JWTs用户的会话在无需再次输入凭证的情况下安全地完成刷新。

您可以使用 [AWS Lambda 触发器](cognito-user-pools-working-with-lambda-triggers.md)来自定义用户进行身份验证的方式。作为身份验证流程的一部分，这些触发器将发布并验证自己的质询。

您还可以在安全后端服务器上对用户使用管理员身份验证流程。您可以使用[用户迁移身份验证流程](cognito-user-pools-using-import-tool.md)来进行用户迁移，而无需用户重置其密码。

# 为托管登录配置身份验证方法
<a name="authentication-flows-selection-managedlogin"></a>

当您希望用户登录、注销或重置密码时，可以调用[托管登录页面](cognito-user-pools-managed-login.md)，这是用户池身份验证的 Web 前端。在此模式下，您的应用程序导入 OIDC 库，以处理在用户池托管登录页面上进行的基于浏览器的身份验证尝试。用户可用的身份验证方式取决于您的用户池配置和应用程序客户端的配置。在应用程序客户端中实现 `ALLOW_USER_AUTH` 流程后，Amazon Cognito 会提示用户从可用选项中选择一种登录方式。如果实现 `ALLOW_USER_PASSWORD_AUTH` 并分配一个 SAML 提供商，则登录页面会向用户提供输入用户名和密码或通过其 IdP 进行登录的选项。

Amazon Cognito 用户池控制台可帮助您快速为应用程序设置托管登录身份验证。创建新的用户池时，请指定您要开发的平台，控制台将为您提供实现 OIDC 的示例，以及带有用于实现登录和注销流程的入门代码的 OAuth 库。您可以使用多种 OIDC 依赖方实现来构建托管登录。建议您尽可能使用[经过认证的 OIDC 依赖方库](https://openid.net/developers/certified-openid-connect-implementations/)。有关更多信息，请参阅 [用户池入门](getting-started-user-pools.md)。

通常，OIDC 信赖方库会定期检查用户池的`.well-known/openid-configuration`终端节点，以确定发行者， URLs 例如令牌端点和授权端点。作为最佳实践，只要存在相应选项，就应实现这种自动发现行为。手动配置颁发者端点可能引入错误。例如，您可能会更改用户池的域。而 `openid-configuration` 的路径并不与用户池域链接，因此能够自动发现服务端点的应用程序将自动适配您的域变更。

## 托管登录的用户池设置
<a name="authentication-flows-selection-managedlogin-settings"></a>

您可能希望为应用程序启用多个身份提供者的登录方式，或者将 Amazon Cognito 用作独立的用户目录。您还可能希望收集用户属性、设置并提示 MFA，或要求使用电子邮件地址作为用户名。您无法直接编辑托管登录和托管 UI 中的字段。相反，托管登录身份验证流程的处理方式由您的用户池配置自动决定。

以下用户池配置项决定了 Amazon Cognito 在托管登录和托管 UI 中向用户展示的身份验证方法。

------
#### [ User pool options (Sign-in menu) ]

以下选项位于 Amazon Cognito 控制台中用户池的**登录**菜单中。

**Cognito 用户池登录选项**  
提供用户名选项。您的托管登录和托管 UI 页面仅接受您所选格式的用户名。例如，当您将用户池设置为使用**电子邮件**作为唯一登录选项时，托管登录页面就只接受电子邮件格式的用户名。

**必需的属性**  
当您在用户池中将某个属性设置为必填项时，托管登录会在用户注册时提示其提供该属性的值。

**基于选择的登录选项**  
[基于选择的身份验证](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)中包含身份验证方法的设置。在此处，您可以启用或禁用[通行密钥](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)和[无密码](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)等身份验证方法。这些方法仅适用于配置了[托管登录域](managed-login-branding.md)且[功能计划](cognito-sign-in-feature-plans.md)高于**精简版**层级的用户池。

**多重身份验证**  
托管登录和托管 UI 负责处理 [MFA](user-pool-settings-mfa.md) 的注册和身份验证操作。当您的用户池要求使用 MFA 时，登录页面会自动提示用户设置额外的身份验证因素。对于已配置 MFA 的用户，登录页面也会提示其输入 MFA 验证码以完成身份验证。当用户池中关闭或设为可选 MFA 时，登录页面不会提示用户设置 MFA。

**用户账户恢复**  
用户池的自助[账户恢复]()设置决定了登录页面是否显示供用户重置密码的链接。

------
#### [ User pool options (Domain menu) ]

以下选项位于 Amazon Cognito 控制台中用户池的**域**菜单中。

**域：**  
您选择的用户池域决定了在调用用户浏览器进行身份验证时，用户所打开链接的路径。

**品牌版本**  
您选择的品牌版本决定了用户池域显示的是托管登录还是托管 UI。

------
#### [ User pool options (Social and external providers menu) ]

以下选项位于 Amazon Cognito 控制台中用户池的**社交和外部提供商**菜单中。

**提供商**  
对于用户池中的每个应用程序客户端，您添加到用户池中的身份提供者 (IdPs) 可以处于活动状态或非活动状态。

------
#### [ App client options ]

以下选项位于 Amazon Cognito 控制台中用户池的**应用程序客户端**菜单中。要查看这些选项，请从列表中选择一个应用程序客户端。

**快速设置指南**  
快速设置指南包含适用于各种开发人员环境的代码示例。它们包含将托管登录身份验证与您的应用程序集成所需的库。

**应用程序客户端信息**  
编辑此配置以设置 IdPs 为当前应用程序客户端所代表的应用程序分配的设置。在托管登录页面上，Amazon Cognito 会向用户显示相应的选项。这些选项由已分配的身份验证方法和 IdP 决定。例如，如果您分配了一个名为 `MySAML` 的 SAML 2.0 IdP 以及本地用户池登录，则托管登录页面将显示身份验证方法提示以及一个用于 `MySAML` 的按钮。

**身份验证设置**  
编辑此配置可设置应用程序的身份验证方法。在托管登录页面上，Amazon Cognito 会向用户显示相应的选项。这些选项由用户池作为 IdP 的可用性以及您所分配的身份验证方法决定。例如，如果您分配了基于选择的 `ALLOW_USER_AUTH` 身份验证，则托管登录页面将显示可用选项，例如输入电子邮件地址或使用通行密钥登录。托管登录页面还会为分配的用户呈现按钮 IdPs。

**登录页面**  
使用此选项卡中提供的选项，可设置托管登录或托管 UI 用户交互式页面的视觉效果。有关更多信息，请参阅 [将品牌应用于托管登录页面](managed-login-branding.md)。

------

# 在中管理身份验证方法 AWS SDKs
<a name="authentication-flows-selection-sdk"></a>

Amazon Cognito 用户池中的用户可以通过多种初始登录选项（也称为*因素*）进行登录。对于某些因素，用户还可以继续完成多重身份验证（MFA）。这些第一重因素包括用户名和密码、一次性密码、通行密钥以及自定义身份验证。有关更多信息，请参阅 [身份验证流程](amazon-cognito-user-pools-authentication-flow-methods.md)。当您的应用程序具有内置 UI 组件并导入 S AWS DK 模块时，您必须构建用于身份验证的应用程序逻辑。此时，您必须从两种主要方法中选择其一，并通过此方法确定要实现的身份验证机制。

您可以实现*基于客户端的身份验证*，即由您的应用程序（或客户端）在一开始就声明所使用的身份验证类型。另一种选择是*基于选择的身份验证*，即您的应用程序先收集用户名，然后请求该用户可用的身份验证类型。您可以根据需求，在同一个应用程序中同时实现这两种模式，或在不同的应用程序客户端之间分别使用。每种方法都有其独有的功能，例如：基于客户端的身份验证支持自定义身份验证，而基于选择的身份验证则支持无密码身份验证。

在使用用户池 API 的 AWS SDK 实现进行身份验证的自定义应用程序中，您的 API 请求结构必须与用户池配置、应用程序客户端配置和客户端首选项保持一致。如果 `InitiateAuth` 会话以 `AuthFlow` 值为 `USER_AUTH` 开始，则启动基于选择的身份验证。Amazon Cognito 会在 API 响应中返回一个质询，内容为用户的首选身份验证方法或可用选项列表。如果会话以 `AuthFlow` 值为 `CUSTOM_AUTH` 开始，则直接进入基于 Lambda 触发器的自定义身份验证流程。

有些身份验证方法固定为两种流程中的一种，有些方法在两种流程中都可用。

**Topics**
+ [基于选择的身份验证](#authentication-flows-selection-choice)
+ [基于客户端的身份验证](#authentication-flows-selection-client)

## 基于选择的身份验证
<a name="authentication-flows-selection-choice"></a>

您的应用程序可以在基于选择的身份验证中请求以下身份验证方法。在[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthParameters)或的`PREFERRED_CHALLENGE`参数中声明这些选项 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthParameters)，或者在[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#CognitoUserPools-RespondToAuthChallenge-request-ChallengeName)或的`ChallengeName`参数中声明这些选项[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html#CognitoUserPools-AdminRespondToAuthChallenge-request-ChallengeName)。

1. `EMAIL_OTP` 和 `SMS_OTP`

   [使用一次性密码进行无密码登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)

1. `WEB_AUTHN`

   [使用密钥进行无密码登录 WebAuthn](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)

1. `PASSWORD`

   [使用永久密码登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password)

   [使用永久密码和安全有效载荷登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp)

   [登录后进行 MFA](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-mfa)

要在其 API 上下文中查看这些选项，请参阅`ChallengeName`中的[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#CognitoUserPools-RespondToAuthChallenge-request-ChallengeName)。

基于选择的登录会发出一个质询以响应您的初始请求。该质询要么验证所请求的选项是否可用，要么提供一份可用选项列表。您的应用程序可将这些选项显示给用户，用户随后输入其首选登录方式的凭证，并通过响应质询继续完成身份验证。

您的身份验证流程中有以下基于选择的选项。此类请求均要求您的应用程序首先收集用户名，或从缓存中获取用户名。

1. 仅使用 `USERNAME` 作为 `AuthParameters` 来请求选项。Amazon Cognito 返回 `SELECT_CHALLENGE` 质询。随后，您的应用程序可以提示用户选择一种质询方式，并将该选择作为响应返回给用户池。

1. 通过在 `PREFERRED_CHALLENGE` 的 `AuthParameters` 以及您首选质询（如有）的参数来请求一个首选质询。例如，如果您请求的 `PREFERRED_CHALLENGE` 为 `PASSWORD_SRP`，则还必须包含 `SRP_A`。如果您的用户、用户池和应用程序客户端都针对首选挑战进行了配置，则 Amazon Cognito 会以该挑战的下一步作为响应，例如`PASSWORD_VERIFIER`在`PASSWORD_SRP`流程中或`EMAIL_OTP`和`SMS_OTP`流程[CodeDeliveryDetails](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CodeDeliveryDetailsType.html)中。如果首选质询不可用，Amazon Cognito 将返回 `SELECT_CHALLENGE`，并附带一份可用质询列表。

1. 首先让用户登录，然后再请求其基于选择的身份验证选项。使用已登录用户的访问令牌的[GetUserAuthFactors](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAuthFactors.html)请求会返回他们可用的基于选择的身份验证因素和 MFA 设置。通过此身份验证选项，用户可先使用用户名和密码登录，随后启用其他形式的身份验证。您也可以使用此操作，为已通过首选质询完成登录的用户检查其他可用选项。

要[为应用程序客户端配置](authentication.md#authentication-implement)基于选择的身份验证，请在允许的身份验证流程中添加 `ALLOW_USER_AUTH`。您还必须在用户池配置中选择要允许的基于选择的身份验证因素。以下流程说明了如何选择基于选择的身份验证因素。

------
#### [ Amazon Cognito console ]

**在用户池中配置基于选择的身份验证选项**

1. 登录 AWS 并导航到 [Amazon Cognito 用户池控制台](https://console.aws.amazon.com/cognito/v2/idp)。选择一个用户池或新建一个。

1. 在用户池配置中，选择**登录**菜单。找到**基于选择的登录选项**，然后选择**编辑**。

1. **密码**选项始终可用。这包括 `PASSWORD` 和 `PASSWORD_SRP` 流程。选择要添加到用户选项中的**其他选项**。您可以为 `WEB_AUTHN` 添加**通行密钥**，为 `EMAIL_OTP` 添加**电子邮件消息一次性密码**，为 `SMS_OTP` 添加 **SMS 消息一次性密码**。

1. 选择**保存更改**。

------
#### [ API/SDK ]

以下部分[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)请求正文配置了基于选择的身份验证的所有可用选项。

```
"Policies": {
    "SignInPolicy": {
        "AllowedFirstAuthFactors": [
            "PASSWORD",
            "WEB_AUTHN",
            "EMAIL_OTP",
            "SMS_OTP"
        ]
    }
},
```

------

## 基于客户端的身份验证
<a name="authentication-flows-selection-client"></a>

基于客户端的身份验证支持以下身份验证流程。在[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow)或的`AuthFlow`参数中声明这些选项[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthFlow)。

1. `USER_PASSWORD_AUTH` 和 `ADMIN_USER_PASSWORD_AUTH`

   [使用永久密码登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password)

   [登录后进行 MFA](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-mfa)

   此身份验证流程在基于选择的身份验证中等同于 `PASSWORD`。

1. `USER_SRP_AUTH`

   [使用永久密码和安全有效载荷登录](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp)

   [登录后进行 MFA](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-mfa)

   此身份验证流程在基于选择的身份验证中等同于 `PASSWORD_SRP`。

1. `REFRESH_TOKEN_AUTH`

   [刷新令牌](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-refresh)

   此身份验证流程仅在基于客户端的身份验证中可用。

1. `CUSTOM_AUTH`

   [自定义身份验证](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-custom)

   此身份验证流程仅在基于客户端的身份验证中可用。

对于基于客户端的身份验证，Amazon Cognito 假设您已在用户开始身份验证流程之前确定了其希望使用的身份验证方式。确定用户要提供的登录因素的逻辑必须通过默认设置或自定义提示来确定，然后在首次向用户池发起的请求中声明。`InitiateAuth` 请求需声明一个与所列选项之一直接对应的登录 `AuthFlow`，例如 `USER_SRP_AUTH`。通过该声明，该请求还包含启动身份验证所需的参数，例如 `USERNAME`、`SECRET_HASH` 和 `SRP_A`。Amazon Cognito 可能会在该请求之后返回额外的质询，例如针对 SRP 的 `PASSWORD_VERIFIER`，或针对使用 TOTP MFA 的密码登录的 `SOFTWARE_TOKEN_MFA`。

要[为应用程序客户端配置](authentication.md#authentication-implement)基于客户端的身份验证，请在允许的身份验证流程中添加 `ALLOW_USER_AUTH` 之外的任何身份验证流程。示例包括 `ALLOW_USER_PASSWORD_AUTH`、`ALLOW_CUSTOM_AUTH`、`ALLOW_REFRESH_TOKEN_AUTH`。允许基于客户端的身份验证流程无需额外的用户池配置。

# 身份验证流程
<a name="amazon-cognito-user-pools-authentication-flow-methods"></a>

Amazon Cognito 用户池的身份验证过程最好可以描述为一个*流程*：用户首先做出初始选择，提交凭证，并响应额外的质询。当您在应用程序中实现托管登录身份验证时，Amazon Cognito 会自动管理这些提示和质询的流程。当您在应用程序后端使用 S AWS DK 实现流程时，必须构造请求逻辑，提示用户输入并响应挑战。

作为应用程序管理员，您的用户特征、安全需求和授权模型将帮助您确定允许用户如何登录。请思考以下问题。
+ 我是否要允许用户使用[其他身份提供者的凭据登录 (IdPs)](#amazon-cognito-user-pools-authentication-flow-methods-federated)？
+ [用户名和密码](#amazon-cognito-user-pools-authentication-flow-methods-password)是否足以作为身份证明？
+ 我的用户名密码身份验证请求是否可能被拦截？ 我的应用程序是否应该直接传输密码，还是应[通过哈希和加密盐协商完成身份验证](#amazon-cognito-user-pools-authentication-flow-methods-srp)？
+ 我是否要允许用户跳过密码输入，[直接接收一次性密码](#amazon-cognito-user-pools-authentication-flow-methods-passwordless)进行登录？
+ 我是否希望允许用户使用[指纹、面部识别或硬件安全密钥](#amazon-cognito-user-pools-authentication-flow-methods-passkey)登录？
+ 我是否需要启用[多重身份验证（MFA）](#amazon-cognito-user-pools-authentication-flow-methods-mfa)？如果需要，应在何时执行？
+ 我是否希望[在不重复提示输入凭证的情况下持久化用户会话](#amazon-cognito-user-pools-authentication-flow-methods-refresh)？
+ 我是否希望[将授权模型扩展到](#amazon-cognito-user-pools-authentication-flow-methods-custom) Amazon Cognito 内置功能之外？

当您回答了这些问题后，就可以学习如何激活相关功能，并在应用程序发起的身份验证请求中加以实现。

为用户设置登录流程后，您可以通过 API 操作请求来检查其当前状态的 MFA [和](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)基于选择的身份验证因素。[GetUserAuthFactors](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAuthFactors.html)此操作需要使用已登录用户的访问令牌进行授权，并返回该用户的身份验证因素及 MFA 设置。

**Topics**
+ [使用第三方登录 IdPs](#amazon-cognito-user-pools-authentication-flow-methods-federated)
+ [使用永久密码登录](#amazon-cognito-user-pools-authentication-flow-methods-password)
+ [使用永久密码和安全有效载荷登录](#amazon-cognito-user-pools-authentication-flow-methods-srp)
+ [使用一次性密码进行无密码登录](#amazon-cognito-user-pools-authentication-flow-methods-passwordless)
+ [使用密钥进行无密码登录 WebAuthn](#amazon-cognito-user-pools-authentication-flow-methods-passkey)
+ [登录后进行 MFA](#amazon-cognito-user-pools-authentication-flow-methods-mfa)
+ [刷新令牌](#amazon-cognito-user-pools-authentication-flow-methods-refresh)
+ [自定义身份验证](#amazon-cognito-user-pools-authentication-flow-methods-custom)
+ [用户迁移身份验证流程](#amazon-cognito-user-pools-user-migration-authentication-flow)

## 使用第三方登录 IdPs
<a name="amazon-cognito-user-pools-authentication-flow-methods-federated"></a>

Amazon Cognito 用户池充当 “用苹果登录”、“用亚马逊登录” 和 OpenID Connect (OIDC) 服务之间的 IdPs身份验证会话的中间代理。此过程也称为*联合登录* 或*联合身份验证*。联合身份验证不使用您在应用程序客户端中配置的任何内置身份验证流程。相反，您可以将已配置的用户池分配 IdPs 给您的应用程序客户端。当用户在托管登录页面选择其 IdP，或您的应用程序通过重定向到该 IdP 的登录页面来发起会话时，联合登录便会触发。

通过联合登录，您将主要身份验证因素和 MFA 身份验证因素委托给用户的 IdP。除非您[将联合用户与本地用户关联](cognito-user-pools-identity-federation-consolidate-users.md)，否则 Amazon Cognito 不会为该联合用户添加本节中提到的其他高级身份验证流程。未关联的联合用户虽有用户名，但其本质上是映射属性数据的存储，通常不会独立于基于浏览器的流程用于登录。

**实现资源**
+ [使用第三方身份提供者进行用户池登录](cognito-user-pools-identity-federation.md)

## 使用永久密码登录
<a name="amazon-cognito-user-pools-authentication-flow-methods-password"></a>

在 Amazon Cognito 用户池中，每个用户都有一个用户名。这可能是电话号码、电子邮件地址，或由用户选择或管理员提供的标识符。此类用户可使用用户名和密码登录，并可选择性地提供 MFA。用户池可通过公开的或经 IAM 授权的 API 操作及 SDK 方法执行用户名密码登录。您的应用程序可以直接将密码发送至用户池进行身份验证。您的用户池会使用其他质询或 JSON Web 令牌 (JWTs) 作为成功身份验证的结果进行响应。

------
#### [ Activate password sign-in ]

要激活使用用户名和密码的[基于客户端的身份验证](authentication-flows-selection-sdk.md#authentication-flows-selection-client)，请配置您的应用程序客户端以允许该方式。在 Amazon Cognito 控制台中，导航到用户池配置中**应用程序**下的**应用程序客户端**菜单。要为客户端移动应用程序或原生应用程序启用明文密码登录，请编辑应用程序客户端，并在**身份验证流程**下选择**使用用户名和密码登录：ALLOW\$1USER\$1PASSWORD\$1AUTH**。要为服务器端应用程序启用明文密码登录，请编辑应用程序客户端，并选择**使用服务器端管理凭证登录：ALLOW\$1ADMIN\$1USER\$1PASSWORD\$1AUTH**。

要激活使用用户名和密码的[基于选择的身份验证](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)，请配置您的应用程序客户端以允许该方式。编辑应用程序客户端，然后选择**基于选择的登录：ALLOW\$1USER\$1AUTH**。

![\[一张来自 Amazon Cognito 控制台的屏幕截图，展示了为应用程序客户端选择明文密码身份验证流程的选项。选项 ALLOW_USER_PASSWORD_AUTH、ALLOW_ADMIN_USER_PASSWORD_AUTH 和 ALLOW_USER_AUTH 已选中。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/screenshot-choose-password-admin-password-and-user-auth.png)


要验证密码身份验证在基于选择的身份验证流程中是否可用，请导航到**登录菜单**，查看**基于选择的登录选项**下的部分。如果**密码**在**可用选项**下可见，则可以使用明文密码身份验证进行登录。**密码**选项包括明文和 SRP 用户名密码身份验证变体。

![\[一张来自 Amazon Cognito 控制台的屏幕截图，展示了用户池在 USER_AUTH 基于选择的登录配置中的密码身份验证选项。“密码”选项显示为已启用。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/screenshot-password-flow-in-user-auth.png)


在[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html)或[UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html)请求中`ExplicitAuthFlows`使用您的首选 username-and-password身份验证选项进行配置。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_PASSWORD_AUTH",
   "ALLOW_ADMIN_USER_PASSWORD_AUTH",
   "ALLOW_USER_AUTH"
]
```

在[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)请求中，`Policies`使用您想要支持的基于选择的身份验证流程进行配置。`AllowedFirstAuthFactors` 中的 `PASSWORD` 值同时包括明文密码和 SRP 身份验证流程选项。

```
"Policies": {
   "SignInPolicy": {
      "AllowedFirstAuthFactors": [
         "PASSWORD",
         "EMAIL_OTP",
         "WEB_AUTHN"
      ]
   }
}
```

------
#### [ Choice-based sign-in with a password ]

要使用用户名密码身份验证让用户登录应用程序，请按以下方式配置您的[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)或[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)请求的正文。如果当前用户符合使用用户名密码身份验证的条件，该登录请求将成功，或继续进入下一个质询。否则，系统将返回一份可用的主要因素身份验证质询列表。以下参数集合是登录所需的最低要求。此外还支持其他参数。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PREFERRED_CHALLENGE" : "PASSWORD",
      "PASSWORD" : "[User's password]"
   },
   "ClientId": "1example23456789"
}
```

您也可以省略 `PREFERRED_CHALLENGE` 值，然后将收到一个响应，其中包含该用户符合条件的登录因素列表。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser"
   },
   "ClientId": "1example23456789"
}
```

如果您未提交首选质询，或所提交的用户不符合其首选质询的条件，Amazon Cognito 将在 `AvailableChallenges` 中返回一个可用选项列表。如果`AvailableChallenges`包含 o `ChallengeName` `PASSWORD` f，则可以使用以下格式的[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)或[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)质询响应继续进行身份验证。您必须传递一个 `Session` 参数，将该质询响应与初始登录请求的 API 响应关联起来。以下参数集合是登录所需的最低要求。此外还支持其他参数。

```
{
   "ChallengeName": "PASSWORD",
   "ChallengeResponses": { 
      "USERNAME" : "testuser",
      "PASSWORD" : "[User's Password]"
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response"
}
```

对于符合条件且成功的首选质询请求，以及 `PASSWORD` 质询响应，Amazon Cognito 会返回令牌，或要求用户完成额外的质询，例如多重身份验证（MFA）。

------
#### [ Client-based sign-in with a password ]

要使用用户名密码身份验证让用户登录到客户端应用程序，请按以下方式配置请求的正文。[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)以下参数集合是登录所需的最低要求。此外还支持其他参数。

```
{
   "AuthFlow": "USER_PASSWORD_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PASSWORD" : "[User's password]"
   },
   "ClientId": "1example23456789"
}
```

要使用用户名密码身份验证让用户登录服务器端应用程序，请按以下方式配置请求的正文。[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)您的应用程序必须使用 AWS 凭证签署此请求。以下参数集合是登录所需的最低要求。此外还支持其他参数。

```
{
   "AuthFlow": "ADMIN_USER_PASSWORD_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PASSWORD" : "[User's password]"
   },
   "ClientId": "1example23456789"
}
```

对于成功的请求，Amazon Cognito 会返回令牌，或要求用户完成额外的质询，例如多重身份验证（MFA）。

------

## 使用永久密码和安全有效载荷登录
<a name="amazon-cognito-user-pools-authentication-flow-methods-srp"></a>

用户池中的另一种用户名密码登录方式是使用安全远程密码（SRP）协议。该选项会发送对密码的“知识证明”，即一个密码哈希值和一个加密盐，供用户池进行验证。由于发送给 Amazon Cognito 的请求中不包含任何可读的密钥信息，因此您的应用程序是能够处理用户输入密码的唯一实体。SRP 身份验证涉及数学计算，建议使用 SDK 中可导入的现有组件来实现。SRP 通常在客户端应用程序（如移动应用程序）中实现。有关该协议的更多信息，请参阅 [The Stanford SRP Homepage](http://srp.stanford.edu/)。[维基百科](https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol)也提供了相关资源和示例。此外，[多种公开的库](https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol#Implementations)可用于在您的身份验证流程中执行 SRP 计算。

Amazon Cognito 身份验证 initiate-challenge-respond顺序使用 SRP 验证用户及其密码。您必须先配置用户池和应用程序客户端以支持 SRP 身份验证，然后在应用程序中实现登录请求与质询响应的逻辑。您的 SRP 库可生成随机数和计算值，用以向用户池证明您持有用户的密码。应用程序需将这些计算得出的值填入 Amazon Cognito 用户池 API 操作或 SDK 方法中用于身份验证的 JSON 格式的 `AuthParameters` 和 `ChallengeParameters` 字段。

------
#### [ Activate SRP sign-in ]

要激活使用用户名和 SRP 的[基于客户端的身份验证](authentication-flows-selection-sdk.md#authentication-flows-selection-client)，请配置您的应用程序客户端以允许该方式。在 Amazon Cognito 控制台中，导航到用户池配置中**应用程序**下的**应用程序客户端**菜单。要为客户端移动应用程序或原生应用程序启用 SRP 登录，请编辑应用程序客户端，并在**身份验证流程**下选择**使用安全远程密码（SRP）登录：ALLOW\$1USER\$1SRP\$1AUTH**。

要激活使用用户名和 SRP 的[基于选择的身份验证](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)，请编辑您的应用程序客户端，并选择**基于选择的登录：ALLOW\$1USER\$1AUTH**。

![\[一张来自 Amazon Cognito 控制台的屏幕截图，展示了为应用程序客户端选择安全远程密码身份验证流程的选项。选项 ALLOW_USER_SRP_AUTH 和 ALLOW_USER_AUTH 已选中。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/screenshot-choose-SRP-and-user-auth.png)


要验证 SRP 身份验证在基于选择的身份验证流程中是否可用，请导航到**登录菜单**，查看**基于选择的登录选项**下的部分。如果**密码**在**可用选项**下可见，则可以使用 SRP 身份验证进行登录。**密码**选项包括明文和 SRP 用户名密码身份验证变体。

![\[一张来自 Amazon Cognito 控制台的屏幕截图，展示了用户池在 USER_AUTH 基于选择的登录配置中的密码身份验证选项。“密码”选项显示为已启用。\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/images/screenshot-password-flow-in-user-auth.png)


在[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html)或[UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html)请求中`ExplicitAuthFlows`使用您的首选 username-and-password身份验证选项进行配置。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_SRP_AUTH",
   "ALLOW_USER_AUTH"
]
```

在[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)请求中，`Policies`使用您想要支持的基于选择的身份验证流程进行配置。`AllowedFirstAuthFactors` 中的 `PASSWORD` 值同时包括明文密码和 SRP 身份验证流程选项。

```
"Policies": {
   "SignInPolicy": {
      "AllowedFirstAuthFactors": [
         "PASSWORD",
         "EMAIL_OTP",
         "WEB_AUTHN"
      ]
   }
}
```

------
#### [ Choice-based sign-in with SRP ]

要让用户通过 SRP 使用用户名密码身份验证登录应用程序，请按以下方式配置您的[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)或[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)请求的正文。如果当前用户符合使用用户名密码身份验证的条件，该登录请求将成功，或继续进入下一个质询。否则，系统将返回一份可用的主要因素身份验证质询列表。以下参数集合是登录所需的最低要求。此外还支持其他参数。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PREFERRED_CHALLENGE" : "PASSWORD_SRP",
      "SRP_A" : "[g^a % N]"
   },
   "ClientId": "1example23456789"
}
```

您也可以省略 `PREFERRED_CHALLENGE` 值，然后将收到一个响应，其中包含该用户符合条件的登录因素列表。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser"
   },
   "ClientId": "1example23456789"
}
```

如果您未提交首选质询，或所提交的用户不符合其首选质询的条件，Amazon Cognito 将在 `AvailableChallenges` 中返回一个可用选项列表。如果`AvailableChallenges`包含 o `ChallengeName` `PASSWORD_SRP` f，则可以使用以下格式的[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)或[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)质询响应继续进行身份验证。您必须传递一个 `Session` 参数，将该质询响应与初始登录请求的 API 响应关联起来。以下参数集合是登录所需的最低要求。此外还支持其他参数。

```
{
   "ChallengeName": "PASSWORD_SRP",
   "ChallengeResponses": { 
      "USERNAME" : "testuser",
      "SRP_A" : "[g^a % N]"
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response"
}
```

Amazon Cognito 会对符合条件的首选质询请求以及 `PASSWORD_SRP` 质询响应返回一个 `PASSWORD_VERIFIER` 质询。您的客户必须完成 SRP 计算并回应[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)或[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)请求中的质疑。

```
{
   "ChallengeName": "PASSWORD_VERIFIER",
   "ChallengeResponses": { 
      "PASSWORD_CLAIM_SIGNATURE" : "string",
      "PASSWORD_CLAIM_SECRET_BLOCK" : "string",
      "TIMESTAMP" : "string"
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

在成功响应 `PASSWORD_VERIFIER` 质询后，Amazon Cognito 会颁发令牌，或要求用户完成另一项必需的质询，例如多重身份验证（MFA）。

------
#### [ Client-based sign-in with SRP ]

SRP 身份验证更常用于客户端身份验证，而非服务器端。但是，您可以将 SRP 身份验证与[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)和[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)一起使用。要将用户登录到应用程序，请按如下方式配置 `InitiateAuth` 或 `AdminInitiateAuth` 请求的正文。以下参数集合是登录所需的最低要求。此外还支持其他参数。

客户端通过将生成元 *g*（模 N）的幂次提升到一个秘密随机整数 *a* 来生成 `SRP_A`。

```
{
   "AuthFlow": "USER_SRP_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "SRP_A" : "[g^a % N]"
   },
   "ClientId": "1example23456789"
}
```

Amazon Cognito 以 `PASSWORD_VERIFIER` 质询进行响应。您的客户必须完成 SRP 计算并回应[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)或[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)请求中的质疑。

```
{
   "ChallengeName": "PASSWORD_VERIFIER",
   "ChallengeResponses": { 
      "PASSWORD_CLAIM_SIGNATURE" : "string",
      "PASSWORD_CLAIM_SECRET_BLOCK" : "string",
      "TIMESTAMP" : "string"
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

在成功响应 `PASSWORD_VERIFIER` 质询后，Amazon Cognito 会颁发令牌，或要求用户完成另一项必需的质询，例如多重身份验证（MFA）。

------

## 使用一次性密码进行无密码登录
<a name="amazon-cognito-user-pools-authentication-flow-methods-passwordless"></a>

密码可能会丢失或被盗。您可能希望仅验证用户是否能够访问已验证的电子邮件地址、电话号码或身份验证器应用程序。解决方法是采用*无密码* 登录。应用程序可以提示用户输入其用户名、电子邮件地址或电话号码。随后，Amazon Cognito 会生成一个一次性密码（OTP），即一个用户必须确认的验证码。用户成功提交该验证码后，身份验证即完成。

一次性密码 (OTP) 身份验证流程与用户池中必需的多因素身份验证 (MFA) 不兼容。当您设置为时，带有用户验证的密钥身份验证可以满足 MFA 要求。`FactorConfiguration` `MULTI_FACTOR_WITH_USER_VERIFICATION`如果 MFA 在您的用户池中是可选的，则激活 MFA 的用户将无法使用 OTP 第一因素登录。在 MFA 为可选的用户池中，没有 MFA 偏好的用户可以使用无密码身份验证因素进行登录。有关更多信息，请参阅 [有关用户池 MFA 的需知信息](user-pool-settings-mfa.md#user-pool-settings-mfa-prerequisites)。

当用户在无密码身份验证流程中正确输入其通过短信或电子邮件收到的验证码时，除了完成用户身份验证外，您的用户池还会将该用户原先未验证的电子邮件地址或电话号码属性标记为已验证。无论您是否将用户池配置为[自动验证](signing-up-users-in-your-app.md)电子邮件地址或电话号码，该用户的状态都会从 `UNCONFIRMED` 变更为 `CONFIRMED`。

**启用无密码登录后的新选项**  
当您在用户池中激活无密码身份验证时，某些用户流程的工作方式会发生变化。

1. 用户在注册时无需设置密码，并在登录时选择一个无密码身份验证因素。您也可以以管理员身份创建不带密码的用户。

1. [通过 CSV 文件导入](cognito-user-pools-using-import-tool.md)的用户可以立即使用无密码身份验证因素登录，无需在登录前设置密码。

1. 没有密码的用户可以提交不带`PreviousPassword`参数[ChangePassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ChangePassword.html)的 API 请求。

**使用自动登录 OTPs**  
通过电子邮件或短信注册并确认其用户帐户的用户 OTPs 可以使用与其确认消息匹配的无密码因素自动登录。在托管登录 UI 中，完成账户确认且符合使用确认码传送方式进行 OTP 登录的条件的用户，在提供确认码后会自动进入首次登录流程。在带有 AWS SDK 的自定义应用程序中，将以下参数传递给[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)或[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)操作。
+ [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html)API 响应中的`Session`参数作为`Session`请求参数。
+ 其中[AuthFlow](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow)之一`USER_AUTH`。

您可以传递值为 `EMAIL_OTP` 或 `SMS_OTP` 的 [PREFERRED\$1CHALLENGE](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthParameters)，但这不是必需的。`Session` 参数提供身份验证的证明，当您传入有效的会话代码时，Amazon Cognito 会忽略 `AuthParameters`。

登录操作将返回表示身份验证成功的响应，如果满足以下条件 [AuthenticationResult](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AuthenticationResultType.html)，则不会再进行其他质询。
+ `Session` 代码有效且未过期。
+ 用户符合使用 OTP 身份验证方法的条件。

------
#### [ Activate passwordless sign-in ]

**控制台**  
要激活无密码登录，请先配置您的用户池，以允许使用一种或多种无密码类型作为主要登录方式，然后配置您的应用程序客户端以允许 `USER_AUTH` 身份验证流程。在 Amazon Cognito 控制台中，导航到用户池配置中**身份验证**下的**登录**菜单。编辑**基于选择的登录选项**，然后选择**电子邮件消息一次性密码**或 **SMS 消息一次性密码**。您可以同时激活这两个选项。保存更改。

导航到**应用程序客户端**菜单，然后选择一个应用程序客户端或新建一个。选择**编辑**，然后选择**登录时选择身份验证类型：ALLOW\$1USER\$1AUTH**。

**API/SDK**  
在用户池 API 中，`SignInPolicy`使用[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)请求中的相应无密码选项进行配置。

```
"SignInPolicy": { 
    "AllowedFirstAuthFactors": [ 
        "EMAIL_OTP",
        "SMS_OTP"
    ]
}
```

使用[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html)或[UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html)请求中的必填选项配置您的应用程序客户端`ExplicitAuthFlows`。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_AUTH"
]
```

------
#### [ Sign in with passwordless ]

无密码登录没有可在和中指定的[基于客户端`AuthFlow`的](authentication-flows-selection-sdk.md#authentication-flows-selection-client)登录方式。[InitiateAuth[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)OTP 身份验证仅在[基于选择](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)`AuthFlow`的情况下可用`USER_AUTH`，您可以在其中请求首选登录选项或从用户的登录选项中选择无密码选项。[AvailableChallenges](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-response-AvailableChallenges)要将用户登录到应用程序，请按如下方式配置 `InitiateAuth` 或 `AdminInitiateAuth` 请求的正文。以下参数集合是登录所需的最低要求。此外还支持其他参数。

在此示例中，我们不知道用户想要通过哪种方式登录。如果我们添加一个 `PREFERRED_CHALLENGE` 参数并且用户可以使用该首选质询，则 Amazon Cognito 将返回该质询。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser"
   },
   "ClientId": "1example23456789"
}
```

您也可以在本例中向 `AuthParameters` 添加 `"PREFERRED_CHALLENGE": "EMAIL_OTP"` 或 `"PREFERRED_CHALLENGE": "SMS_OTP"`。如果用户符合该首选方式的使用条件，您的用户池会立即向该用户的电子邮件地址或电话号码发送验证码，并返回 `"ChallengeName": "EMAIL_OTP"` 或 `"ChallengeName": "SMS_OTP"`。

如果您没有指定首选质询，Amazon Cognito 会返回一个 `AvailableChallenges` 参数。

```
{
   "AvailableChallenges": [ 
      "EMAIL_OTP", 
      "SMS_OTP",
      "PASSWORD"
    ],
   "Session": "[Session ID]"
}
```

该用户符合以下登录方式的条件：通过电子邮件消息 OTP 进行无密码登录、通过短信 OTP 进行无密码登录以及使用用户名密码登录。您的应用程序可以提示用户选择其中一种方式，也可以根据内部逻辑自动做出选择。然后，它继续执行选择挑战的[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)或[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)请求。假设用户希望使用电子邮件消息一次性密码完成无密码身份验证。

```
{
   "ChallengeName": "SELECT_CHALLENGE",
   "ChallengeResponses": { 
      "USERNAME" : "testuser",
      "ANSWER" : "EMAIL_OTP" 
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

Amazon Cognito 会返回一个 `EMAIL_OTP` 质询，并向该用户已验证的电子邮件地址发送一个验证码。随后，您的应用程序必须再次对该质询作出响应。

如果您之前请求了 `EMAIL_OTP` 作为 `PREFERRED_CHALLENGE`，那么这同样会是接下来的质询响应步骤。

```
{
   "ChallengeName": "EMAIL_OTP",
   "ChallengeResponses": {
      "USERNAME" : "testuser", 
      "EMAIL_OTP_CODE" : "123456" 
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

------

## 使用密钥进行无密码登录 WebAuthn
<a name="amazon-cognito-user-pools-authentication-flow-methods-passkey"></a>

通行密钥是安全的，对用户施加的工作量相对较低。通行密钥登录利用*身份验证器*，即用户可用于身份验证的外部设备。常规密码容易使用户面临钓鱼攻击、密码猜测和凭证盗用等漏洞。而使用通行密钥，您的应用程序可以利用手机及其他与信息系统连接或内置的设备中的高级安全措施。常见的通行密钥登录工作流通常始于向您的设备发起一次调用，以触发您的密码或*凭证* 管理器，例如 iOS 钥匙串或 Google Chrome 密码管理器。设备上的凭证管理器会提示用户选择一个通行密钥，并通过已有的凭据或设备解锁机制进行授权。现代手机配备了人脸识别、指纹识别、解锁图案等机制，其中一些机制可同时满足强身份验证中的*所知因素* 和*所有因素* 原则。在使用生物识别进行通行密钥身份验证的情况下，通行密钥还体现了*所是因素*.这一身份验证因素。

您可能希望用指纹、面部识别或安全密钥身份验证来替代密码。这是*密钥*或*WebAuthn*身份验证。应用程序开发人员通常允许用户在首次使用密码登录后注册生物识别设备。通过 Amazon Cognito 用户池，您的应用程序可以为用户配置此登录选项。当您的用户池设置为时，密钥身份验证可以满足多因素身份验证 (MFA) 要求。`FactorConfiguration` `MULTI_FACTOR_WITH_USER_VERIFICATION`在此配置中，带有用户验证的密钥身份验证算作多因素身份验证。

一次性密码 (OTP) 身份验证流程与用户池中必需的多因素身份验证 (MFA) 不兼容。当您设置为时，带有用户验证的密钥身份验证可以满足 MFA 要求。`FactorConfiguration` `MULTI_FACTOR_WITH_USER_VERIFICATION`如果 MFA 在您的用户池中是可选的，则激活 MFA 的用户将无法使用 OTP 第一因素登录。在 MFA 为可选的用户池中，没有 MFA 偏好的用户可以使用无密码身份验证因素进行登录。有关更多信息，请参阅 [有关用户池 MFA 的需知信息](user-pool-settings-mfa.md#user-pool-settings-mfa-prerequisites)。

### 通行密钥是什么？
<a name="amazon-cognito-user-pools-authentication-flow-methods-passkey-what-are"></a>

Passkeys 无需记住复杂的密码或输入 OTPs，从而简化了用户体验。Passkeys 基于[万维网联盟](https://www.w3.org/TR/webauthn-3/) (W3C) WebAuthn 和 FIDO（Fast Identity Online）联盟起草的 CTAP2 标准。*浏览器和平台实施这些标准，提供 APIs 网络或移动应用程序以启动密钥注册或身份验证过程，还提供用户界面供用户选择密钥身份验证器并与之交互。*

当用户在网站或应用程序中注册身份验证器时，身份验证器会创建公私密钥对。 WebAuthn 浏览器和平台将公钥提交给网站或应用程序的应用程序后端。身份验证器保留有关用户和应用程序的私钥 IDs、密钥和元数据。当用户希望使用已注册的身份验证器在注册的应用程序中进行身份验证时，该应用程序会生成一个随机质询。对该质询的响应是由身份验证器使用其为该用户和应用程序所保存的私有密钥生成的质询数字签名，并附带相关元数据。浏览器或应用程序平台接收到该数字签名后，会将其传递给应用程序后端。然后，应用程序使用之前存储的公有密钥来验证该签名。

**注意**  
您的应用程序不会收到用户向其身份验证器提供的任何身份验证密钥，也不会获得有关私有密钥的任何信息。

以下是一些当前市场上身份验证器的示例及其功能。某个身份验证器可能符合其中任意一类或多类。
+ 某些身份验证器在授予访问权限前会执行*用户验证*，使用的因素包括 PIN、面部或指纹等生物识别输入或密码，以确保只有合法用户才能授权操作。另一些身份验证器则不具备任何用户验证功能，还有一些在应用程序未要求时可以跳过用户验证。
+ 某些身份验证器（例如 YubiKey 硬件令牌）是便携式的。它们可通过 USB、蓝牙或 NFC 连接与设备通信。有些身份验证器则属于本地身份验证器，并与特定平台绑定，例如 PC 上的 Windows Hello 或 iPhone 上的 Face ID。如果设备足够小巧（如移动设备），设备绑定的身份验证器可由用户随身携带。有时，用户还能通过无线通信方式将硬件身份验证器连接到多个不同平台。例如，在桌面浏览器中，用户扫描一个二维码后，即可使用自己的智能手机作为通行密钥身份验证器。
+ 一些平台绑定的通行密钥会同步到云端，从而支持用户在多个设备上使用。例如，iPhone 上的 Face ID 通行密钥会将通行密钥元数据通过用户的 Apple 账户同步至 iCloud 钥匙串。这类通行密钥可在 Apple 设备之间实现无缝身份验证，不需要用户为每台设备单独注册。1Password、Dashlane 和 Bitwarden 等基于软件的身份验证器应用程序，也会在用户安装了该应用程序的所有平台上同步通行密钥。

 WebAuthn 用术语来说，网站和应用程序是*依赖方*。每个通行密钥都与一个特定的依赖方 ID 关联，依赖方 ID 是一个统一标识符，代表接受该通行密钥进行身份验证的网站或应用程序。开发人员必须谨慎选择其依赖方 ID，以确保身份验证的范围恰当。典型的依赖方 ID 是 Web 服务器的根域名。使用该依赖方 ID 规范的通行密钥可用于该域及其所有子域的身份验证。当用户尝试访问的网站 URL 与依赖方 ID 不匹配时，浏览器和平台会拒绝通行密钥身份验证。类似地，对于移动应用程序，只有当应用程序路径出现在由该应用程序在依赖方 ID 所指定的路径下公开提供的 `.well-known` 关联文件中时，通行密钥才能被使用。

通行密钥具有*可发现性*。浏览器或平台可以自动识别并使用它们，无需用户手动输入用户名。当用户访问支持通行密钥身份验证的网站或应用程序时，可以从浏览器或平台已知的通行密钥列表中进行选择，也可以扫描二维码。

### Amazon Cognito 如何实现通行密钥身份验证？
<a name="amazon-cognito-user-pools-authentication-flow-methods-passkey-cognito"></a>

通行密钥是一项可选功能，在除**精简版**外的所有[功能计划](cognito-sign-in-feature-plans.md)中均可用。它仅支持[基于选择的身份验证流程](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)。使用[托管登录](authentication-flows-selection-managedlogin.md)时，Amazon Cognito 会处理通行密钥身份验证的逻辑。您还可以使用中的 [Amazon Cognito 用户池 API 在 AWS SDKs](#amazon-cognito-user-pools-authentication-flow-methods)应用程序后端进行密钥身份验证。

Amazon Cognito 可以识别使用两种非对称加密算法 (-7) 和 ES256 (-257) 中的任何一种创建的密钥。 RS256大多数身份验证器都支持这两种算法。默认情况下，用户可以设置任意类型的身份验证器，例如硬件令牌、移动智能手机或软件身份验证器应用程序。Amazon Cognito 目前不支持[证明](https://csrc.nist.gov/glossary/term/attestation)强制执行。

在用户池中，您可以将用户验证配置为首选或必需。在未提供值的 API 请求中，该选项默认选择首选，而在 Amazon Cognito 控制台中，该选项也默认选择首选。当您将用户验证设置为首选时，用户可以设置不具备用户验证功能的身份验证器，且注册和身份验证操作可在不执行用户验证的情况下成功完成。要强制在通行密钥注册和身份验证过程中进行用户验证，请将此设置更改为必需。

您在通行密钥配置中设置的依赖方（RP）ID 是一项关键决策。如果您未另行指定，且您的[域品牌版本](managed-login-branding.md)使用的是托管登录，则用户池默认会将您的[自定义域](cognito-user-pools-add-custom-domain.md)作为预期的 RP ID。如果您没有配置自定义域，也未另行指定 RP ID，则用户池默认使用您的[前缀域](cognito-user-pools-assign-domain-prefix.md)作为 RP ID。您也可以将 RP ID 配置为任意一个不在公共后缀列表（PSL）中的域名。您的 RP ID 条目适用于托管登录和 SDK 身份验证中的通行密钥注册与身份验证。在移动应用程序中，通行密钥仅在 Amazon Cognito 能够在以您的 RP ID 为域的路径下找到 `.well-known` 关联文件时才能正常工作。作为最佳实践，请在您的网站或应用程序公开上线前，确定并设置好依赖方 ID 的值。如果您更改了 RP ID，用户必须使用新的 RP ID 重新注册。

每个用户最多可以注册 20 个通行密钥。用户必须至少成功登录过您的用户池一次后，才能注册通行密钥。托管登录能大幅简化通行密钥的注册流程。当您为用户池和应用程序客户端启用通行密钥身份验证后，使用托管登录域的用户池会在最终用户注册新用户账户后，自动提示其注册通行密钥。您也可以在任意时间引导用户的浏览器跳转至托管登录页面，以完成通行密钥注册。用户必须先提供用户名，Amazon Cognito 才能启动通行密钥身份验证。托管登录会自动处理这一过程。登录页面会先提示用户输入用户名，验证该用户是否已注册至少一个通行密钥，然后提示其使用通行密钥登录。同样地，在基于 SDK 的应用程序中，也必须先提示用户输入用户名，并在身份验证请求中提供该用户名。

当您为用户池配置通行密钥身份验证，并且同时拥有自定义域和前缀域时，RP ID 默认会使用您自定义域的完全限定域名（FQDN）。要在 Amazon Cognito 控制台中将前缀域设置为 RP ID，请删除您的自定义域，或将前缀域的 FQDN 作为**第三方域**手动输入。

------
#### [ Activate passkey sign-in ]

**控制台**  
要激活通行密钥登录，请先配置您的用户池，以允许使用一种或多种无密码类型作为主要登录方式，然后配置您的应用程序客户端以允许 `USER_AUTH` 身份验证流程。在 Amazon Cognito 控制台中，导航到用户池配置中**身份验证**下的**登录**菜单。编辑**基于选择的登录选项**，然后将**通行密钥**添加到**可用选项**列表中。

导航到**身份验证方法**菜单并编辑**通行密钥**。
+ **用户验证**是一项设置，用于控制您的用户池是否要求通行密钥设备执行额外的检查，以确认当前用户有权使用通行密钥。要鼓励用户配置设备以支持用户验证，但不强制要求，请选择**首选**。要仅支持具备用户验证功能的设备，请选择**必需**。有关更多信息，请参阅 w3.org 上的[用户验证](https://www.w3.org/TR/webauthn-2/#user-verification)。
+ **依赖方 ID 的域**是应用程序将在用户的通行密钥注册请求中传递的标识符。它设定了与用户通行密钥颁发者的信任关系的目标。您的依赖方 ID 可以是：您的用户池的域，前提是   
**Cognito 域名**  
您的用户池中的 Amazon Cognito [前缀域](cognito-user-pools-assign-domain-prefix.md)。  
**自定义域**  
您的用户池的[自定义域](cognito-user-pools-add-custom-domain.md)。  
**第三方域**  
指用于不使用用户池托管登录页面的应用程序的域。此设置通常与没有[域](cognito-user-pools-assign-domain.md)的用户池相关联，这些用户池在后端使用 S AWS DK 和用户池 API 进行身份验证。

导航到**应用程序客户端**菜单，然后选择一个应用程序客户端或新建一个。选择**编辑**，在**身份验证流程**下，选择**登录时选择身份验证类型：ALLOW\$1USER\$1AUTH**。

**API/SDK**  
在用户池 API 中，`SignInPolicy`使用[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)请求中的相应密钥选项进行配置。通行密钥身份验证的 `WEB_AUTHN` 选项必须至少附带一个其他选项。通行密钥注册需要现有的身份验证会话。

```
"SignInPolicy": { 
    "AllowedFirstAuthFactors": [ 
        "PASSWORD",
        "WEB_AUTHN"
    ]
}
```

在[SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html#CognitoUserPools-SetUserPoolMfaConfig-request-WebAuthnConfiguration)请求的`WebAuthnConfiguration`参数中配置您的用户验证首选项和 RP ID。其中，`RelyingPartyId`（即通行密钥身份验证结果的预期目标）可以是您的用户池前缀域、自定义域，或您自行指定的其他域。

```
"WebAuthnConfiguration": { 
   "RelyingPartyId": "example.auth.us-east-1.amazoncognito.com",
   "UserVerification": "preferred",
   "FactorConfiguration": "SINGLE_FACTOR"
}
```

使用[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html)或[UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html)请求中的必填选项配置您的应用程序客户端`ExplicitAuthFlows`。

```
"ExplicitAuthFlows": [ 
   "ALLOW_USER_AUTH"
]
```

------
#### [ Register a passkey (managed login) ]

托管登录负责处理用户通行密钥的注册。当您的用户池启用了通行密钥身份验证后，Amazon Cognito 会在用户注册新账户时提示其设置通行密钥。

当用户已完成注册但尚未设置通行密钥，或您作为管理员为其创建了账户时，Amazon Cognito 不会提示用户设置通行密钥。处于这种状态的用户必须先使用其他身份验证因素（例如密码或无密码 OTP）成功登录，才能注册通行密钥。

**注册通行密钥**

1. 将用户引导至您的[登录页面](authorization-endpoint.md)。

   ```
   https://auth.example.com/oauth2/authorize/?client_id=1example23456789&response_type=code&scope=email+openid+phone&redirect_uri=https%3A%2F%2Fwww.example.com
   ```

1. 处理用户的身份验证结果。在此示例中，Amazon Cognito 会将用户重定向到 `www.example.com`，并附带一个应用程序可用来换取令牌的授权码。

1. 将用户引导至您的注册通行密钥页面。用户浏览器中有一个 Cookie，用于维持其已登录会话。该通行密钥页面的 URL 需包含 `client_id` 和 `redirect_uri` 参数。Amazon Cognito 仅允许已通过身份验证的用户访问此页面。请先使用密码、电子邮件 OTP 或短信 OTP 让用户完成登录，然后调用符合以下模式的 URL。

   您还可以在此请求中添加其他[对端点授权](authorization-endpoint.md)参数，例如 `response_type` 和 `scope`。

   ```
   https://auth.example.com/passkeys/add?client_id=1example23456789&redirect_uri=https%3A%2F%2Fwww.example.com
   ```

------
#### [ Register a passkey (SDK) ]

您可以在[PublicKeyCreationOptions](https://www.w3.org/TR/webauthn-3/#dictdef-publickeycredentialcreationoptions)对象中使用元数据注册密钥凭证。您可以使用已登录用户的凭证生成该对象，并将其以 API 请求的形式提交给用户的通行密钥颁发者。颁发者将返回一个确认密钥注册的 [RegistrationResponseJSON](https://www.w3.org/TR/webauthn-3/#dictdef-registrationresponsejson) 对象。

要开始通行密钥注册过程，请使用现有登录选项登录用户。使用当前用户的访问[令牌授权[StartWebAuthnRegistration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StartWebAuthnRegistration.html)](authentication-flows-public-server-side.md#user-pool-apis-auth-unauth-token-auth)的 API 请求进行授权。以下是一个示例 `GetWebAuthnRegistrationOptions` 请求的正文。

```
{
   "AccessToken": "eyJra456defEXAMPLE"
}
```

您的用户池返回的响应中包含 `PublicKeyCreationOptions` 对象。请将该对象以 API 请求的方式发送给用户的颁发者。此对象提供公有密钥和依赖方 ID 等信息。颁发者随后将返回一个 `RegistrationResponseJSON` 对象。

在 [CompleteWebAuthnRegistration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CompleteWebAuthnRegistration.html)API 请求中显示注册响应，再次使用用户的访问令牌进行授权。当您的用户池返回一个 HTTP 200 响应且正文为空时，即表示该用户的通行密钥已注册。

------
#### [ Sign in with a passkey ]

无密码登录没有你可以在和`AuthFlow`中指定的密码。[InitiateAuth[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)相反，您必须声明 `AuthFlow` 为 `USER_AUTH`，然后请求一个登录选项，或根据用户池返回的响应选择您的无密码登录方式。要将用户登录到应用程序，请按如下方式配置 `InitiateAuth` 或 `AdminInitiateAuth` 请求的正文。以下参数集合是登录所需的最低要求。此外还支持其他参数。

在此示例中，我们知道用户希望使用通行密钥登录，因此我们添加了一个 `PREFERRED_CHALLENGE` 参数。

```
{
   "AuthFlow": "USER_AUTH",
   "AuthParameters": { 
      "USERNAME" : "testuser",
      "PREFERRED_CHALLENGE" : "WEB_AUTHN"
   },
   "ClientId": "1example23456789"
}
```

Amazon Cognito 以 `WEB_AUTHN` 质询进行响应。您的应用程序必须对该质询作出响应。向用户的通行密钥提供商发起一个登录请求。它将返回一个 [AuthenticationResponseJSON](https://www.w3.org/TR/webauthn-3/#dictdef-authenticationresponsejson) 对象。

```
{
   "ChallengeName": "WEB_AUTHN",
   "ChallengeResponses": {
      "USERNAME" : "testuser", 
      "CREDENTIAL" : "{AuthenticationResponseJSON}" 
   },
   "ClientId": "1example23456789",
   "Session": "[Session ID from the previous response]"
}
```

------

## 登录后进行 MFA
<a name="amazon-cognito-user-pools-authentication-flow-methods-mfa"></a>

您可以设置用户在通过用户名密码流程完成登录后，被提示进行额外的验证，例如通过电子邮件消息、短信或验证码生成应用程序提供的一次性密码。MFA 不同于使用一次性密码的无密码登录。但是，当您在用户池中`FactorConfiguration`配置`MULTI_FACTOR_WITH_USER_VERIFICATION`为时，带有用户验证功能的密钥可以满足 MFA 要求。`WebAuthnConfiguration`对于基于密码的流程，用户池中的 MFA 是一种质询-响应模型，在这种模型中，用户首先证明自己知道密码，然后证明他们有权访问注册的第二要素设备。

**实现资源**
+ [向用户池添加 MFA](user-pool-settings-mfa.md)

## 刷新令牌
<a name="amazon-cognito-user-pools-authentication-flow-methods-refresh"></a>

当您希望用户在无需重新输入凭证的情况下保持登录状态时，*刷新令牌* 是您的应用程序可用于持久化用户会话的工具。应用程序可以向您的用户池提供刷新令牌，并将其兑换为新的 ID 令牌和访问令牌。通过令牌刷新，您可以在无需用户干预的情况下，确保已登录用户仍处于活跃状态、获取更新后的属性信息，并更新访问控制权限。

**实现资源**
+ [刷新令牌](amazon-cognito-user-pools-using-the-refresh-token.md)

## 自定义身份验证
<a name="amazon-cognito-user-pools-authentication-flow-methods-custom"></a>

您可能希望为用户配置一种此处未列出的身份验证方法。您可以使用带有 Lambda 触发器的*自定义身份验证* 来实现这一点。在一系列 Lambda 函数中，Amazon Cognito 会发出一个质询，向用户提出一个用户必须回答的问题，验证回答的准确性，并确定是否应发出另一个质询。这些问题和回答可以包括安全问题、对 CAPTCHA 服务的请求、对外部 MFA 服务 API 的请求，或按顺序组合使用以上所有方式。

**实现资源**
+ [自定义身份验证质询 Lambda 触发器](user-pool-lambda-challenge.md)

### 自定义身份验证流程
<a name="amazon-cognito-user-pools-custom-authentication-flow"></a>

Amazon Cognito 用户池实现了使用自定义身份验证流程，这可以帮助您使用 AWS Lambda 触发器创建基于质询/响应的身份验证模型。

自定义身份验证流程可以自定义质询和响应周期，以满足不同需求。该流程首先调用 `InitiateAuth` API 操作，该调用指示将使用的身份验证类型并提供了所有初始身份验证参数。Amazon Cognito 将使用以下类型的信息之一响应 `InitiateAuth` 调用：
+ 用户质询及会话和参数。
+ 错误（如果用户未能通过身份验证）
+ ID、访问和刷新令牌（如果 `InitiateAuth` 调用中提供的参数足以使用户登录）。（通常，用户或应用程序必须首先应答质询，但这必须由您的自定义代码决定。）

 如果 Amazon Cognito 使用质询响应 `InitiateAuth` 调用，则应用程序将收集更多输入并调用 `RespondToAuthChallenge` 操作。此调用提供质询响应并将其传回会话。Amazon Cognito 对 `RespondToAuthChallenge` 的响应类似于对 `InitiateAuth` 调用的响应。如果用户已登录，Amazon Cognito 会提供令牌，如果用户未登录，则 Amazon Cognito 会提供另一个质询或错误。如果 Amazon Cognito 返回另一质询，则序列重复，应用程序调用 `RespondToAuthChallenge` 直到用户成功登录或返回错误。有关 `InitiateAuth` 和 `RespondToAuthChallenge` API 操作的详细信息，请参阅 [API 文档](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html)。

### 自定义身份验证流程和质询
<a name="Custom-authentication-flow-and-challenges"></a>

应用程序可以启动自定义身份验证流程，具体方法是：调用 `InitiateAuth` 并将 `CUSTOM_AUTH` 用作 `Authflow`。借助自定义身份验证流程，三个 Lambda 触发器控制响应的质询和验证。
+ `DefineAuthChallenge` Lambda 触发器将以前的质询和响应的会话数组作为输入。然后，它生成下一个质询名称和布尔值，指示用户是否通过身份验证并且应被授予令牌。此 Lambda 触发器是一个状态机，可通过质询控制用户的路径。
+ `CreateAuthChallenge` Lambda 触发器将质询名称作为输入并生成质询和参数以评估响应。当 `DefineAuthChallenge` 返回 `CUSTOM_CHALLENGE` 作为下一次质询时，身份验证流程调用 `CreateAuthChallenge`。`CreateAuthChallenge` Lambda 触发器在质询元数据参数中传递下一个类型的质询。
+ `VerifyAuthChallengeResponse` Lambda 函数会评估响应并返回布尔值以表明响应是否有效。

自定义身份验证流程还可以使用内置质询的组合，例如 SRP 密码验证和通过短信进行的 MFA。它可以使用自定义质询，如验证码或秘密问题。

### 在自定义身份验证流程中使用 SRP 密码验证
<a name="Using-SRP-password-verification-in-custom-authentication-flow"></a>

如果您希望将 SRP 包含在自定义身份验证流程中，则您必须开始使用 SRP。
+ 要在自定义流程中启动 SRP 密码验证，应用程序将 `CUSTOM_AUTH` 作为 `Authflow` 来调用 `InitiateAuth`。在 `AuthParameters` 映射 中，来自应用程序的请求包括 `SRP_A:`（SRP A 值）和 `CHALLENGE_NAME: SRP_A`。
+ `CUSTOM_AUTH` 流会使用 `challengeName: SRP_A` 和 `challengeResult: true` 的初始会话调用 `DefineAuthChallenge` Lambda 触发器。您的 Lambda 函数使用 `challengeName: PASSWORD_VERIFIER`、`issueTokens: false` 和 `failAuthentication: false` 作出响应。
+  接下来，该应用程序必须使用 `challengeName: PASSWORD_VERIFIER` 和 `challengeResponses` 映射中 SRP 所需的其它参数调用 `RespondToAuthChallenge`。
+ 如果 Amazon Cognito 验证了密码，`RespondToAuthChallenge` 使用 `challengeName: PASSWORD_VERIFIER` 和 `challengeResult: true` 的第二个会话调用 `DefineAuthChallenge` Lambda 触发器。此时，`DefineAuthChallenge` Lambda 触发器可以使用 `challengeName: CUSTOM_CHALLENGE` 响应来开启自定义质询。
+ 如果为用户启用了 MFA，则在 Amazon Cognito 验证密码后，您的用户将被要求设置 MFA 或使用 MFA 登录。

**注意**  
Amazon Cognito 托管的登录网页无法激活 [自定义身份验证质询 Lambda 触发器](user-pool-lambda-challenge.md)。

有关 Lambda 触发器的更多信息，包括示例代码，请参阅[使用 Lambda 触发器自定义用户池工作流](cognito-user-pools-working-with-lambda-triggers.md)。

## 用户迁移身份验证流程
<a name="amazon-cognito-user-pools-user-migration-authentication-flow"></a>

用户迁移 Lambda 触发器可帮助您将用户从旧式用户管理系统迁移到您的用户池。如果选择 `USER_PASSWORD_AUTH` 身份验证流程，则用户在用户迁移过程中无需重置密码。此流程在身份验证期间通过加密的 SSL 连接向服务发送用户的密码。

所有用户均完成迁移后，请切换为更安全的 SRP 流程。SRP 流程不通过网络发送任何密码。

要了解有关 Lambda 触发器的更多信息，请参阅[使用 Lambda 触发器自定义用户池工作流](cognito-user-pools-working-with-lambda-triggers.md)。

有关使用 Lambda 触发器迁移用户的更多信息，请参阅[利用用户迁移 Lambda 触发器导入用户](cognito-user-pools-import-using-lambda.md)。

# API 和 SDK 身份验证的授权模型
<a name="authentication-flows-public-server-side"></a>

在开发支持用户池身份验证的应用程序之初，您必须根据您的应用程序类型选择合适的 API 授权模型。授权模型是一个用于对 Amazon Cognito 用户池 API 及 SDK 集成中的身份验证组件进行请求授权的系统。Amazon Cognito 提供三种授权模型：IAM 授权、公共访问和令牌授权。

在 IAM 授权的请求中，授权来自请求的 `Authorization` 标头中由一组 AWS IAM 凭证生成的签名。对于服务器端应用程序，这种做法通过 IAM 授权来保护身份验证操作。而在公共（未经身份验证的）身份验证请求中，则无需任何授权。这种方式适用于分发给用户的客户端应用程序。令牌授权的操作通常与公共操作结合使用，授权来自于请求的 `Authorization` 标头中包含的会话令牌或访问令牌。Amazon Cognito 身份验证通常要求您按顺序实现两个或更多 API 操作，而具体使用哪些 API 操作则取决于您的应用程序特性。公共客户端（应用程序分发给用户时使用）采用的是公共操作，也就是说，用户发起登录请求时，不需要获得授权。令牌授权操作用于在公共应用程序中延续用户的会话。而服务器端客户端（其中，应用程序逻辑托管在远程系统上）则通过对登录请求的 IAM 授权来保护身份验证操作。以下 API 操作组合及其对应的 SDK 方法，分别对应可用的多种授权模型。

每个公共身份验证操作都有某种形式的服务器端等效操作，例如[UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html)和。[AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html)客户端操作由用户发起，通常需要用户确认，而服务器端操作则假定更改是由用户池管理员提交的，因此更改会立即生效。在此示例中，Amazon Cognito 向用户发送了一条包含确认码的消息，用户的访问令牌授权了提交验证码的[VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html)请求。而服务器端应用程序则可以立即设置任意属性的值，但在更改用于登录的电子邮件地址或电话号码时，[需遵循特殊规则](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html#CognitoUserPools-AdminUpdateUserAttributes-request-UserAttributes)。

要比较 API 身份验证并查看 API 操作及其授权模型的完整列表，请参阅[了解 API、OIDC 和托管登录页面身份验证](#user-pools-API-operations)。

------
#### [ Client-side (public) authentication ]

以下是一个客户端应用程序中典型的请求序列

1. 公共[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)操作会提交主要证书，例如用户名和密码。

1. 令牌授权的[RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)操作从`InitiateAuth`响应和质询的答案中提交*会话*令牌，例如 MFA。会话令牌授权表示属于 not-yet-complete身份验证周期一部分的请求。

1. 令牌授权[ConfirmDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmDevice.html)操作提交*访问*令牌并执行写入操作，将记住的设备添加到用户的个人资料中。访问令牌授权用于标识那些用户在完成身份验证后发起的自助操作请求。

有关更多信息，请参阅[客户端身份验证选项](#amazon-cognito-user-pools-client-side-authentication-flow)和[了解 API、OIDC 和托管登录页面身份验证](#user-pools-API-operations)。

------
#### [ Server-side authentication ]

以下是一个服务器端操作中典型的请求序列。每个请求都包含一个 [AWS 签名版本 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html) 授权标头，该标头使用颁发给应用程序服务器的 IAM 机器凭证进行签名。

1. 该[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)操作会提交主要凭证，例如用户名和密码。

1. [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)操作提交质疑的答案，例如 MFA。

1. 该[AdminUpdateDeviceStatus](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateDeviceStatus.html)操作将`AdminInitiateAuth`[响应](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#API_AdminInitiateAuth_ResponseSyntax)中的设备密钥设置为已记住的。

有关更多信息，请参阅[服务器端身份验证选项](#amazon-cognito-user-pools-server-side-authentication-flow)和[了解 API、OIDC 和托管登录页面身份验证](#user-pools-API-operations)。

------

用户通过应答连续的质询进行身份验证，直到身份验证失败或 Amazon Cognito 向用户颁发令牌。您可以在包含不同质询的流程中对 Amazon Cognito 重复这些步骤，以支持任何自定义身份验证流程。

**Topics**
+ [服务器端身份验证选项](#amazon-cognito-user-pools-server-side-authentication-flow)
+ [客户端身份验证选项](#amazon-cognito-user-pools-client-side-authentication-flow)
+ [了解 API、OIDC 和托管登录页面身份验证](#user-pools-API-operations)
+ [按授权模型分组的 API 操作列表](#user-pool-apis-auth-unauth)

## 服务器端身份验证选项
<a name="amazon-cognito-user-pools-server-side-authentication-flow"></a>

Web 应用程序及其他*服务器端* 应用程序在远程服务器上实现身份验证，客户端通过浏览器或 SSH 会话等远程显示应用程序加载这些服务器。服务器端应用程序通常具有以下特征。
+ 它们是使用 Java、Ruby 或 Node.js 等语言开发并部署在服务器上的应用程序。
+ 它们连接到可能包含客户端密钥的用户池[应用程序客户端](user-pool-settings-client-apps.md)，这类客户端称为*机密客户端*。
+ 他们有权访问 AWS 证书。
+ 它们调用[托管登录](cognito-user-pools-managed-login.md)实现身份验证，或在用户池 API 中使用 AWS SDK 调用 IAM 授权的操作。
+ 它们主要面向内部用户，也可能面向公众客户提供服务。

通过用户池 API 执行的服务器端操作可以使用密码、一次性密码或通行密钥作为主要的登录因素。对于服务器端应用程序，用户池身份验证与客户端应用程序的身份验证类似，但以下情况除外：
+ 服务器端应用程序发出 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)API 请求。此操作需要具有包含`cognito-idp:AdminInitiateAuth`和权限的 AWS 证书`cognito-idp:AdminRespondToAuthChallenge`。该操作返回必需的质询或身份验证结果。
+ 当应用程序收到质询时，它会发出 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)API 请求。此 `AdminRespondToAuthChallenge` API 操作也需要 AWS 凭证。

有关使用 AWS 凭证签署 Amazon Cognito API 请求的更多信息，请参阅*AWS 一般*参考中的[签名版本 4 签名流程](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)。

在 `AdminInitiateAuth` 响应 `ChallengeParameters` 中，`USER_ID_FOR_SRP` 属性（如果存在）包含用户的实际用户名而不是别名（如电子邮件地址或电话号码）。在 `AdminRespondToAuthChallenge` 调用的 `ChallengeResponses` 中，您必须在 `USERNAME` 参数中传递此用户名。

**注意**  
由于后端管理员实施使用管理员身份验证流程，该流程不支持“记住的设备”功能。在您启用设备跟踪时，管理员身份验证成功，但任何对刷新访问令牌的调用均会失败。

## 客户端身份验证选项
<a name="amazon-cognito-user-pools-client-side-authentication-flow"></a>

移动应用程序及其他*客户端* 应用程序类型安装在用户的设备上，并在本地执行身份验证逻辑和用户界面的逻辑。它们通常具有以下特征。
+ 它们使用 React Native、Flutter 和 Swift 等语言开发，并部署到用户设备上。
+ 它们连接到不包含客户端密钥的用户池[应用程序客户端](user-pool-settings-client-apps.md)，这类客户端称为*公共客户端*。
+ 他们无法访问授权 IAM 授权的 API 请求的 AWS 证书。
+ 他们调用[托管登录](cognito-user-pools-managed-login.md)进行身份验证，或者使用 SDK 在用户池 API 中使用公开和令牌授权的操作。 AWS 
+ 它们面向公众客户，允许任何人注册和登录。

通过用户池 API 执行的客户端操作可以使用密码、一次性密码或通行密钥作为主要的登录因素。以下过程适用于您使用[AWS Amplify](https://docs.amplify.aws/javascript/start/getting-started/)或创建的用户客户端应用程序。[AWS SDKs](https://aws.amazon.com/developer/tools/)

1. 用户将他们的用户名和密码输入到应用程序中。

1. 应用程序使用用户的用户名和安全远程密码（SRP）详细信息调用 `InitiateAuth` 操作。

   此 API 操作返回身份验证参数。
**注意**  
该应用程序使用内置的 Amazon Cognito SRP 功能生成 SRP 详细信息。 AWS SDKs

1. 应用程序调用 `RespondToAuthChallenge` 操作。如果调用成功，则 Amazon Cognito 返回用户的令牌，并且身份验证流程完成。

   如果 Amazon Cognito 需要另一个质询，则对 `RespondToAuthChallenge` 的调用不返回任何令牌。相反，调用会返回一个会话。

1. 如果 `RespondToAuthChallenge` 返回一个会话，应用程序将再次调用 `RespondToAuthChallenge`，这次使用会话和质询响应（例如，MFA 代码）。

## 了解 API、OIDC 和托管登录页面身份验证
<a name="user-pools-API-operations"></a>

Amazon Cognito 用户池是多种身份验证技术的组合。他们是外部身份提供商 (IdPs) 的依赖方。它们 IdPs 适用于使用 OpenID Connect (OIDC) 实现身份验证的应用程序。 SDKs它们作为 JSON Web 令牌 (JWTs) 的发行者提供身份验证，类似于 OIDC 身份验证，但使用的是其中的一部分 API 方法。 AWS SDKs它们也可以作为您应用程序的安全入口点。

当您想要注册、登录和管理用户池中的用户时，有两种选择。

1. 您的*托管登录页面* 和经典*托管 UI* 包括[托管登录用户交互式端点](managed-login-endpoints.md)以及处理 IdP 和依赖方角色的[联合端点](federation-endpoints.md)。它们构成了一个公开网页包，当您为用户池[选择域](cognito-user-pools-assign-domain.md)时，Amazon Cognito 会激活这些网页。要快速开始使用 Amazon Cognito 用户池的身份验证和授权功能，包括注册、登录、密码管理和多重身份验证（MFA）页面，请使用托管登录的内置用户界面。

   其他用户池端点便于使用第三方身份提供商进行身份验证（IdPs）。他们执行的服务包括以下各项。

   1. 服务提供商回调终端节点，用于来自您的经过身份验证的声明 IdPs，比如`saml2/idpresponse`和。`oauth2/idpresponse`当 Amazon Cognito 是您的应用程序和 IdP 之间的中间服务提供者（SP）时，回调端点代表服务。

   1. 提供有关您的环境的信息的端点，例如 `oauth2/userInfo` 和 `/.well-known/jwks.json`。您的应用在使用 OIDC 或 2.0 开发者库验证令牌或检索用户个人资料数据时会使用这些端点。 OAuth 

1. [Amazon Cognito 用户池 API](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/Welcome.html) 是一组用于您的 Web 或移动应用程序的工具，用于在您自己的自定义前端中收集登录信息之后验证用户身份。用户池 API 身份验证生成以下 JSON Web 令牌。

   1. 带有来自您的用户的可验证属性声明的身份令牌。

   1. 一种访问令牌，用于授权用户针对 [AWS 服务端点](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)创建经令牌授权的 API 请求。
**注意**  
默认情况下，来自用户池 API 身份验证的访问令牌仅包含 `aws.cognito.signin.user.admin` 作用域。要生成具有额外作用域的访问令牌（例如，授权对第三方 API 的请求），请在通过用户池端点进行身份验证期间请求作用域，或者在 [令牌生成前 Lambda 触发器](user-pool-lambda-pre-token-generation.md) 中添加自定义作用域。自定义访问令牌会增加您的 AWS 账单费用。

   1. 一种刷新令牌，用于授权请求新 ID 令牌和访问令牌，并刷新用户身份和访问控制属性。

您可以将通常通过用户池端点登录的联合用户与其配置文件位于用户池*本地* 的用户相关联。本地用户仅存在于您的用户池目录中，无需通过外部 IdP 进行联合身份验证。如果您在 [AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html)API 请求中将他们的联合身份关联到本地用户，则他们可以使用用户池 API 登录。有关更多信息，请参阅 [将联合用户与现有用户配置文件关联](cognito-user-pools-identity-federation-consolidate-users.md)。

Amazon Cognito 用户池 API 有双重用途。

1. 它创建和配置您的 Amazon Cognito 用户池资源。例如，您可以创建用户池、添加 AWS Lambda 触发器以及配置托管您的托管登录页面的用户池域。

1. 它还为本地用户和关联的用户执行注册、登录和其他用户操作。

**使用 Amazon Cognito 用户池 API 的示例场景**

1. 用户选择了您在应用程序中创建的“创建账户”按钮。他们输入电子邮件地址和密码。

1. 您的应用程序发送 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html)API 请求并在您的用户池中创建了一个新用户。

1. 应用程序提示用户输入电子邮件确认码。用户输入他们在电子邮件中收到的代码。

1. 您的应用会发送包含用户确认码的 [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html)API 请求。

1. 应用程序提示您的用户输入用户名和密码，而用户输入其信息。

1. 您的应用程序发送 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)API 请求并存储 ID 令牌、访问令牌和刷新令牌。应用程序调用 OIDC 库来管理用户的令牌并为该用户维护持久会话。

在 Amazon Cognito 用户池 API 中，您无法登录通过 IdP 进行联合身份验证的用户。您必须通过用户池端点对这些用户进行身份验证。有关包含托管登录的用户池端点的更多信息，请参阅[用户池端点和托管登录参考](cognito-userpools-server-contract-reference.md)。

联合用户可以在托管登录中开始登录并选择其 IdP，您也可以跳过托管登录，将用户直接发送到您的 IdP 以进行登录。当您的 API 发送请求到 [对端点授权](authorization-endpoint.md) 且带有 IdP 参数时，Amazon Cognito 会以静默方式将用户重定向到 IdP 登录页面。

**托管登录页面的场景示例**

1. 用户选择了您在应用程序中创建的“创建账户”按钮。

1. 托管登录向用户提供您注册开发人员凭证使用的社交身份提供者列表。您的用户选择了 Apple。

1. 您的应用程序向 [对端点授权](authorization-endpoint.md) 发出请求，提供者名称为 `SignInWithApple`。

1. 用户的浏览器打开 Apple 身份验证页面。用户登录，并选择授权 Amazon Cognito 读取其个人资料信息。

1. Amazon Cognito 确认 Apple 访问令牌并查询用户的 Apple 个人资料。

1. 用户向您的应用程序出示 Amazon Cognito 授权码。

1. 应用程序中的 OIDC 库与 [令牌端点](token-endpoint.md) 交换授权码并存储用户池颁发的 ID 令牌、访问令牌和刷新令牌。应用程序使用 OIDC 库来管理用户的令牌并为该用户维护持久会话。

用户池 API 和托管登录页面支持多种应用场景，这些场景在本指南中均有说明。以下部分探讨了用户池 API 如何进一步划分为支持您的注册、登录和资源管理要求的类。

## 按授权模型分组的 API 操作列表
<a name="user-pool-apis-auth-unauth"></a>

Amazon Cognito 用户池 API 既是资源管理接口，也是面向用户的身份验证和授权接口，结合了其操作中遵循的授权模型。根据 API 操作，您可能需要使用 IAM 凭证、访问令牌、会话令牌、客户端密钥或者前面这些内容的组合提供授权。对于许多用户身份验证和授权操作，您可以选择请求的经过身份验证和未经身份验证的版本。对于分发给用户的应用程序（例如移动应用程序），最佳安全实践是提供未经身份验证的操作；您无需在代码中包含任何密钥。

您只能在 IAM policy 中为 [IAM 授权的管理操作](#user-pool-apis-auth-unauth-sigv4-management) 和 [IAM 授权的用户操作](#user-pool-apis-auth-unauth-sigv4-user) 分配权限。

### IAM 授权的管理操作
<a name="user-pool-apis-auth-unauth-sigv4-management"></a>

IAM 授权的管理操作会修改和查看您的用户池和应用程序客户端配置，就像您在 AWS 管理控制台中所做的那样。

例如，要在 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html)API 请求中修改您的用户池，您必须出示 AWS 证书和 IAM 权限才能更新资源。

要在 AWS Command Line Interface (AWS CLI) 或 AWS 软件开发工具包中授权这些请求，请使用环境变量或向请求添加 IAM 证书的客户端配置来配置您的环境。有关更多信息，请参阅中的[AWS 使用您的 AWS 凭证进行访问*AWS 一般参考*](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys)。对于 Amazon Cognito 用户池 API，您也可以直接向[服务端点](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)发送请求。您必须使用在请求*标题中嵌入的 AWS 凭据对这些请求进行授权或签名*。有关更多信息，请参阅[签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。


| IAM 授权的管理操作 | 
| --- |
| [AddCustomAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AddCustomAttributes.html) | 
| [CreateGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateGroup.html) | 
| [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) | 
| [CreateResourceServer](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateResourceServer.html) | 
| [CreateUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserImportJob.html) | 
| [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) | 
| [CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html) | 
| [CreateUserPoolDomain](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolDomain.html) | 
| [DeleteGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteGroup.html) | 
| [DeleteIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteIdentityProvider.html) | 
| [DeleteResourceServer](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteResourceServer.html) | 
| [DeleteUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserPool.html) | 
| [DeleteUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserPoolClient.html) | 
| [DeleteUserPoolDomain](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserPoolDomain.html) | 
| [DescribeIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeIdentityProvider.html) | 
| [DescribeResourceServer](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeResourceServer.html) | 
| [DescribeRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeRiskConfiguration.html) | 
| [DescribeUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserImportJob.html) | 
| [DescribeUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPool.html) | 
| [DescribeUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPoolClient.html) | 
| [DescribeUserPoolDomain](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPoolDomain.html) | 
| [获取 CSVHeader](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetCSVHeader.html) | 
| [GetGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetGroup.html) | 
| [GetIdentityProviderByIdentifier](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetIdentityProviderByIdentifier.html) | 
| [GetSigningCertificate](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetSigningCertificate.html) | 
| [获取 UICustomization](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUICustomization.html) | 
| [GetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserPoolMfaConfig.html) | 
| [ListGroups](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListGroups.html) | 
| [ListIdentityProviders](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListIdentityProviders.html) | 
| [ListResourceServers](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListResourceServers.html) | 
| [ListTagsForResource](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListTagsForResource.html) | 
| [ListUserImportJobs](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUserImportJobs.html) | 
| [ListUserPoolClients](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUserPoolClients.html) | 
| [ListUserPools](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUserPools.html) | 
| [ListUsers](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html) | 
| [ListUsersInGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsersInGroup.html) | 
| [SetRiskConfiguration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetRiskConfiguration.html) | 
| [Set UICustomization](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUICustomization.html) | 
| [SetUserPoolMfaConfig](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserPoolMfaConfig.html) | 
| [StartUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StartUserImportJob.html) | 
| [StopUserImportJob](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StopUserImportJob.html) | 
| [TagResource](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_TagResource.html) | 
| [UntagResource](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UntagResource.html) | 
| [UpdateGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateGroup.html) | 
| [UpdateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateIdentityProvider.html) | 
| [UpdateResourceServer](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateResourceServer.html) | 
| [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) | 
| [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html) | 
| [UpdateUserPoolDomain](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolDomain.html) | 

### IAM 授权的用户操作
<a name="user-pool-apis-auth-unauth-sigv4-user"></a>

IAM 授权的用户操作注册、登录、管理凭证、修改和查看您的用户。

例如，您可以有一个服务器端应用程序层，为 Web 前端提供支持。您的服务器端应用程序是您信任的 OAuth 机密客户端，可以访问您的 Amazon Cognito 资源。要在应用程序中注册用户，您的服务器可以在 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html)API 请求中包含 AWS 凭据。有关 OAuth 客户端类型的更多信息，请参阅 * OAuth 2.0 授权框架中的*[客户端类型](https://www.rfc-editor.org/rfc/rfc6749#section-2.1)。

要在 AWS CLI 或 AWS SDK 中授权这些请求，请使用环境变量或向请求添加 IAM 证书的客户端配置来配置服务器端应用程序环境。有关更多信息，请参阅中的[AWS 使用您的 AWS 凭证进行访问*AWS 一般参考*](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys)。对于 Amazon Cognito 用户池 API，您也可以直接向[服务端点](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)发送请求。您必须使用在请求*标题中嵌入的 AWS 凭据对这些请求进行授权或签名*。有关更多信息，请参阅[签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。

如果您的应用程序客户端有客户端密钥，则您必须提供 IAM 凭证，并在 `AuthParameters` 中提供 `SecretHash` 参数或 `SECRET_HASH` 值（取决于操作）。有关更多信息，请参阅 [计算密钥哈希值](signing-up-users-in-your-app.md#cognito-user-pools-computing-secret-hash)。


| IAM 授权的用户操作 | 
| --- |
| [AdminAddUserToGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminAddUserToGroup.html) | 
| [AdminConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminConfirmSignUp.html) | 
| [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html) | 
| [AdminDeleteUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDeleteUser.html) | 
| [AdminDeleteUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDeleteUserAttributes.html) | 
| [AdminDisableProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDisableProviderForUser.html) | 
| [AdminDisableUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminDisableUser.html) | 
| [AdminEnableUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminEnableUser.html) | 
| [AdminForgetDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminForgetDevice.html) | 
| [AdminGetDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminGetDevice.html) | 
| [AdminGetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminGetUser.html) | 
| [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) | 
| [AdminLinkProviderForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminLinkProviderForUser.html) | 
| [AdminListDevices](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListDevices.html) | 
| [AdminListGroupsForUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListGroupsForUser.html) | 
| [AdminListUserAuthEvents](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminListUserAuthEvents.html) | 
| [AdminRemoveUserFromGroup](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRemoveUserFromGroup.html) | 
| [AdminResetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminResetUserPassword.html) | 
| [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) | 
| [AdminSetUserMFAPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserMFAPreference.html) | 
| [AdminSetUserPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserPassword.html) | 
| [AdminSetUserSettings](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminSetUserSettings.html) | 
| [AdminUpdateAuthEventFeedback](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateAuthEventFeedback.html) | 
| [AdminUpdateDeviceStatus](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateDeviceStatus.html) | 
| [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) | 
| [AdminUserGlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUserGlobalSignOut.html) | 

### 未经身份验证的用户操作
<a name="user-pool-apis-auth-unauth-unauth"></a>

未经身份验证的用户操作注册、登录以及为您的用户启动密码重置。当您希望 Internet 上的任何人都可以注册并登录您的应用程序时，请使用未经身份验证（*公开*）的 API 操作。

例如，要在您的应用程序中注册用户，您可以分发一个不提供任何密钥特权访问权限的 OAuth 公共客户端。您可以使用未经身份验证的 API 操作[SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html)注册此用户。

要在使用 AWS SDK 开发的公共客户端中发送这些请求，您无需配置任何凭据。对于没有额外授权的 Amazon Cognito 用户池 API，您也可以直接向[服务端点](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)发送请求。

如果您的应用程序客户端有客户端密钥，则您必须在 `AuthParameters` 中提供 `SecretHash` 参数或 `SECRET_HASH` 值（取决于操作）。有关更多信息，请参阅 [计算密钥哈希值](signing-up-users-in-your-app.md#cognito-user-pools-computing-secret-hash)。


| 未经身份验证的用户操作 | 
| --- |
| [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) | 
| [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html) | 
| [ResendConfirmationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ResendConfirmationCode.html) | 
| [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) | 
| [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) | 
| [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) | 

### 经过令牌授权的用户操作
<a name="user-pool-apis-auth-unauth-token-auth"></a>

经过令牌授权的用户操作在用户已登录或开始登录流程之后，注销、管理其凭证、修改和查看用户。如果您不想在应用程序中分发密钥，并且想要使用用户自己的凭证授权请求，请使用经过令牌授权的 API 操作。如果用户已完成登录，则您必须使用访问令牌来授权其经过令牌授权的 API 请求。如果您的用户正在登录流程中，则您必须使用 Amazon Cognito 在对先前请求的响应中返回的会话令牌，授权其经过令牌授权的 API 请求。

例如，在公共客户端中，您可能希望更新用户的配置文件，限制用户仅对自己的配置文件具有写入权限。要进行此更新，您的客户端可以在 [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html)API 请求中包含用户的访问令牌。

要在使用 AWS SDK 开发的公共客户端中发送这些请求，您无需配置任何凭据。在您的请求中包含 `AccessToken` 或 `Session` 参数。对于 Amazon Cognito 用户池 API，您也可以直接向[服务端点](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html)发送请求。要向服务端点授权请求，请在请求的 POST 正文中包含访问令牌或会话令牌。

要签署经过令牌授权的操作的 API 请求，请将访问令牌作为 `Authorization` 标头包含在请求中，格式为 `Bearer <Base64-encoded access token>`。


| 经过令牌授权的用户操作 | AccessToken | 会话 | 
| --- |--- |--- |
| [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) |  | ✓ | 
| [ChangePassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ChangePassword.html) | ✓ |  | 
| [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html) | ✓ |  | 
| [StartWebAuthnRegistration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_StartWebAuthnRegistration.html) | ✓ |  | 
| [CompleteWebAuthnRegistration](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CompleteWebAuthnRegistration.html) | ✓ |  | 
| [DeleteWebAuthnCredential](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteWebAuthnCredential.html) | ✓ |  | 
| [ListWebAuthnCredentials](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListWebAuthnCredentials.html) | ✓ |  | 
| [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html) | ✓ |  | 
| [DeleteUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUserAttributes.html) | ✓ |  | 
| [DeleteUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DeleteUser.html) | ✓ |  | 
| [ConfirmDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmDevice.html) | ✓ |  | 
| [ForgetDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgetDevice.html) | ✓ |  | 
| [GetDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetDevice.html) | ✓ |  | 
| [ListDevices](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListDevices.html) | ✓ |  | 
| [UpdateDeviceStatus](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateDeviceStatus.html) | ✓ |  | 
| [GetUserAttributeVerificationCode](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUserAttributeVerificationCode.html) | ✓ |  | 
| [VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html) | ✓ |  | 
| [SetUserSettings](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserSettings.html) | ✓ |  | 
| [SetUserMFAPreference](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUserMFAPreference.html) | ✓ |  | 
| [GlobalSignOut](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GlobalSignOut.html) | ✓ |  | 
| [UpdateAuthEventFeedback](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateAuthEventFeedback.html) |  | ✓ | 
| [AssociateSoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AssociateSoftwareToken.html) | ✓ | ✓ | 
| [VerifySoftwareToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifySoftwareToken.html) | ✓ | ✓ | 
| [RevokeToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RevokeToken.html)¹ |  |  | 
| [GetTokensFromRefreshToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetTokensFromRefreshToken.html)¹ |  |  | 

¹ `RevokeToken` 和 `GetTokensFromRefreshToken` 将刷新令牌作为授权参数。刷新令牌用作授权令牌和目标资源。