

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

# 向用户池添加社交登录
<a name="tutorial-create-user-pool-social-idp"></a>

让用户能够通过其现有的公共或社交身份提供者登录您的应用程序，这样可以改善他们的身份验证体验。Amazon Cognito 用户池与 Facebook、Google、Amazon 和 Apple 等热门社交身份提供商 (IdPs) 集成，为您的用户提供了他们已经熟悉的便捷登录选项。

设置社交登录时，您为用户提供了一种备选方案，为您的应用程序创建一个专用账户。这样可以提高转化率，使注册过程更加顺畅。从用户的角度来看，他们可以应用现有的社交凭证来快速进行身份验证，而无需记住另一个用户名和密码。

在用户池中配置社交 IdP 涉及几个关键步骤。您必须向社交服务提供者注册您的应用程序才能获得客户端 ID 和密钥。然后，您可以将社交 IdP 配置添加到用户池中，指定要请求的范围以及要从 IdP 属性映射的用户池属性。在运行时，Amazon Cognito 会处理与提供者的令牌交换、映射用户属性，并以共享用户池格式向应用程序发放令牌。

## 向社交 IdP 注册
<a name="cognito-user-pools-social-step-1"></a>

在使用 Amazon Cognito 创建社交 IdP 之前，必须向社交 IdP 注册应用程序才能接收客户端 ID 和客户端密钥。

### 向 Facebook 注册应用程序
<a name="register-an-app-with-facebook"></a>

1. 创建 [Facebook 开发人员账户](https://developers.facebook.com/docs/facebook-login)。

1. 使用 Facebook 凭证[登录](https://developers.facebook.com/)。

1. 在 **My Apps**（我的应用程序）菜单上，选择 **Create New App**（创建新的应用程序）。

   如果您没有现有 Facebook 应用程序，则会看到另一个选项。选择 **Create App（创建应用程序）**。

1. 在**创建应用程序**页面上，为您的应用程序选择一个用例，然后选择**下一步**。

1. 输入 Facebook 应用程序的名称，然后选择**创建应用程序**。

1. 在左侧导航栏上，选择**应用程序设置**，然后选择**基本**。

1. 记下 **App ID**（应用程序 ID）和 **App Secret**（应用程序密钥）。您将在下一节中使用它们。

1. 从页面底部选择 **\$1 添加平台**。

1. 在**选择平台**屏幕上，选择您的平台，然后选择**下一步**。

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

1. 为 **App Domains**（应用程序域）输入用户池域。

   ```
   https://your_user_pool_domain
   ```

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

1. 从导航栏中，选择**产品**，然后从 **Facebook 登录**中选择**配置**。

1. 从 **Facebook 登录**的**配置**菜单中，选择**设置**。

   在 “**有效重定向” 中输入您的 OAuth 重定向** URL URIs。重定向 URL 包含具有 `/oauth2/idpresponse` 端点的用户池域。

   ```
   https://your_user_pool_domain/oauth2/idpresponse
   ```

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

### 向 Amazon 注册应用程序
<a name="register-an-app-with-amazon"></a>

1. 创建 [Amazon 开发人员账户](https://developer.amazon.com/login-with-amazon)。

1. 使用 Amazon 凭证[登录](https://developer.amazon.com/lwa/sp/overview.html)。

1. 您需要创建一个 Amazon 安全配置文件才能接收 Amazon 客户端 ID 和客户端密钥。

   从页面顶部的导航栏中选择**应用程序和服务**，然后选择 **Login with Amazon**。

1. 选择 **Create a Security Profile**（创建安全配置文件）。

1. 输入 **Security Profile Name**（安全配置文件名称）、**Security Profile Description**（安全配置文件描述）和 **Consent Privacy Notice URL**（同意隐私声明 URL）。

1. 选择 **Save**（保存）。

1. 选择 **Client ID**（客户端 ID）和 **Client Secret**（客户端密钥）以显示客户端 ID 和密钥。您将在下一节中使用它们。

1. 将鼠标悬停在齿轮图标上并选择 **Web Settings**（Web 设置），然后选择 **Edit**（编辑）。

1. 将用户池域输入到 **Allowed Origins**（允许的源）中。

   ```
   https://<your-user-pool-domain>
   ```

1. 在 “**允许的返回**” 中输入您的用户池域和`/oauth2/idpresponse`终端节点 URLs。

   ```
   https://<your-user-pool-domain>/oauth2/idpresponse
   ```

1. 选择**保存**。

### 向 Google 注册应用程序
<a name="register-an-app-with-google"></a>

有关 Google Cloud 平台中 OAuth 2.0 的更多信息，请参阅 Google Workspace 开发者版文档中的[了解身份验证和授权](https://developers.google.com/workspace/guides/auth-overview)。

1. 创建 [Google 开发人员账户](https://developers.google.com/identity)。

1. 登录到 [Google Cloud Platform 控制台](https://console.cloud.google.com/home/dashboard)。

1. 从顶部导航栏中，选择 **Select a project**（选择项目）。如果您在 Google 平台中已经有项目，则此菜单会改为显示您的默认项目。

1. 选择 **NEW PROJECT**（新建项目）。

1. 输入产品的名称，然后选择 **CREATE**（创建）。

1. 在左侧导航栏上，选择**APIs 和服务**，然后选择 **Oauth同意**屏幕。

1. 输入应用程序信息，包括**应用程序域**、**授权域**和**开发人员联系信息**。**授权域**必须包括 `amazoncognito.com` 和自定义域的根。例如：`example.com`。选择 **SAVE AND CONTINUE**（保存并继续）。

1. 1. 在 “**范围**” 下，选择 “**添加或移除范围**”，然后至少选择以下 OAuth范围。

   1. `.../auth/userinfo.email`

   1. `.../auth/userinfo.profile`

   1. openid

1. 在 **Test users**（测试用户）下，选择 **Add users**（添加用户）。输入您的电子邮件地址和任何其他授权测试用户，然后选择**保存并继续**。

1. 再次展开左侧导航栏，选择**APIs 和服务**，然后选择**凭证**。

1. 选择 “**创建凭据**”，然后选择 “**OAuth 客户端 ID**”。

1. 选择 **Application type**（应用程序类型）并为客户端提供 **Name**（名称）。

1. 在**授权 JavaScript 来源**下，选择**添加 URI**。输入用户群体域。

   ```
   https://<your-user-pool-domain>
   ```

1. 在 “**授权重定向**” 下 URIs，选择 “**添加 URI**”。输入指向用户群体域的 `/oauth2/idpresponse` 端点的路径。

   ```
   https://<your-user-pool-domain>/oauth2/idpresponse
   ```

1. 选择**创建**。

1. 安全地存储 Google 在**您的客户端 ID** 和**您的客户端密钥**下显示的值。当您添加 Google IdP 时，请向 Amazon Cognito 提供这些值。

### 向 Apple 注册应用程序
<a name="register-an-app-with-apple"></a>

有关设置“通过 Apple 登录”的更多信息，请参阅 Apple 开发人员文档中的[配置环境以通过 Apple 登录](https://developer.apple.com/documentation/signinwithapple/configuring-your-environment-for-sign-in-with-apple)。

1. 创建 [Apple 开发人员账户](https://developer.apple.com/programs/enroll/)。

1. 使用 Apple 凭证[登录](https://developer.apple.com/account/#/welcome)。

1. 在左侧导航栏上，选择 **Certificates, Identifiers & Profiles**（证书、标识符和配置文件）。

1. 在左侧导航栏上，选择 **Identifiers (标识符)**。

1. 在 **Identifiers (标识符)** 页面上，选择 **\$1** 图标。

1. 在 “**注册新标识符**” 页面上，选择 “**应用程序**” IDs，然后选择 “**继续**”。

1. 在**选择类型**页面上，选择**应用程序**，然后选择**继续**。

1. 在 **Register an App ID**（注册应用程序 ID）页面上，执行以下操作：

   1. 在 **Description**（说明）下，输入说明。

   1. 在 **App ID Prefix**（应用程序 ID 前缀）下，输入 **Bundle ID**（捆绑包 ID）。记下 **App ID Prefix**（应用程序 ID 前缀）下的值。在[使用社交 IdP 配置用户池](cognito-user-pools-social-idp.md#cognito-user-pools-social-idp-step-2)中选择 Apple 作为身份提供商后，您将使用此值。

   1. 在 **Capabilities**（功能）下，选择 **Sign In with Apple**，然后选择 **Edit**（编辑）。

   1. 在 “**使用 Apple 登录：应用程序 ID 配置**” 页面上，选择将应用程序设置为主应用程序或与其他应用程序分组 IDs，然后选择 “**保存**”。

   1. 选择 **Continue**（继续）。

1. 在 **Confirm your App ID**（确认您的应用程序 ID）页面上，选择 **Register**（注册）。

1. 在 **Identifiers (标识符)** 页面上，选择 **\$1** 图标。

1. 在 “**注册新标识符**” 页上，选择 “**服务**” IDs，然后选择 “**继续**”。

1. 在 **Register an Services ID**（注册服务 ID）页面上，执行以下操作：

   1. 在 **Description**（说明）下，输入说明。

   1. 在 **Identifier**（标识符）下，输入标识符。记下此服务 ID，因为在[使用社交 IdP 配置用户池](cognito-user-pools-social-idp.md#cognito-user-pools-social-idp-step-2)中选择 Apple 作为身份提供者后需要此值。

   1. 选择 **Continue (继续)**，然后选择 **Register (注册)**。

1. 从标识符页面选择刚创建的服务 ID。

   1. 选择 **Sign In with Apple**（使用苹果账号登录），然后选择 **Configure**（配置）。

   1. 在 **Web Authentication Configuration**（Web 身份验证配置）页上，选择您先前创建的应用程序 ID 作为 **Primary App ID**（主应用程序 ID）。

   1. 选择 “**网站**” 旁边的 “**\$1**” 图标 URLs。

   1. 在 **Domains and subdomains**（域名和子域）下，输入不带 `https://` 前缀的用户群体域。

      ```
      <your-user-pool-domain>
      ```

   1. 在 **Return** 下 URLs，输入您的用户池域`/oauth2/idpresponse`终端节点的路径。

      ```
      https://<your-user-pool-domain>/oauth2/idpresponse
      ```

   1. 选择**下一步**，然后选择**完成**。您不需要验证域。

   1. 选择 **Continue**（继续），然后选择 **Save**（保存）。

1. 在左侧导航栏上，选择 **Keys (密钥)**。

1. 在 **Keys**（密钥）页面上，选择 **\$1** 图标。

1. 在 **Register a New Key**（注册新密钥）页面上，执行以下操作：

   1. 在 **Key Name**（密钥名称）下，输入密钥名称。

   1. 选择 **Sign In with Apple**，然后选择 **Configure**（配置）。

   1. 在**配置密钥**页面上，选择您先前创建的应用程序 ID 作为**主应用程序 ID**。选择**保存**。

   1. 选择 **Continue**（继续），然后选择 **Register**（注册）。

1. 在**下载您的密钥**页面上，选择**下载**来下载私有密钥，并记下显示的**密钥 ID**，然后选择**完成**。在[使用社交 IdP 配置用户池](cognito-user-pools-social-idp.md#cognito-user-pools-social-idp-step-2)中选择 Apple 作为身份提供商后，您将需要此私有密钥和在此页面上显示的 **Key ID**（密钥 ID）值。

## 将社交 IdP 添加到用户池
<a name="cognito-user-pools-social-step-2"></a>

在本节中，您使用上一节中的客户端 ID 和客户端密钥在用户池中配置社交 IdP。

**使用配置用户池社交身份提供商 AWS 管理控制台**

1. 转到 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)。系统可能会提示您输入 AWS 凭证。

1. 选择**用户池**。

1. 从列表中选择一个现有用户池，或[创建一个用户池](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 选择**社交和外部提供商**菜单。找到 **Federated sign-in**（联合登录），然后选择 **Add an identity provider**（添加身份提供者）。

1. 选择一个社交身份提供者：**Facebook**、**Google**、**Login with Amazon** 或 **Sign in with Apple**。

1. 根据您选择的社交身份提供者，从以下步骤中进行选择：
   + **Google** 和 **Login with Amazon** – 输入在上一部分中生成的**应用程序客户端 ID** 和**应用程序客户端密钥**。
   + **Facebook** – 输入在上一部分中生成的**应用程序客户端 ID** 和**应用程序客户端密钥**，然后选择 API 版本（例如，版本 2.12）。建议选择最新的可用版本，因为每个 Facebook API 都有一个生命周期和一个弃用日期。Facebook 的范围和属性可能因 API 版本而异。建议您使用 Facebook 测试您的社交身份登录，以确保联合会按预期运行。
   + **Sign in with Apple**– 输入在上一部分中生成的**服务 ID**、**团队 ID**、**密钥 ID** 和**私有密钥**。

1. 输入要使用的**授权范围**的名称。范围定义了您要通过应用程序访问的用户属性（如 `name` 和 `email`）。对于 Facebook，这些属性应用逗号分隔。对于 Google 和 Login with Amazon，则应采用空格分隔。对于 Sign in with Apple，选中要访问的范围的复选框。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/tutorial-create-user-pool-social-idp.html)

   您的应用程序用户需要同意向您的应用程序提供这些属性。关于社交服务提供商范围的更多信息，请参阅 Google、Facebook 和 Login with Amazon 或 Sign in with Apple 的文档。

   对于 Sign in with Apple，下面提供了可能不会返回范围的用户场景：
   + 终端用户离开 Apple 登录页面后出现故障（可能来自 Amazon Cognito 内部的故障或开发人员编写的任何内容）。
   + 服务 ID 标识符用于 and/or 其他身份验证服务的用户池。
   + 开发人员在用户登录后添加额外的范围。用户仅在进行身份验证和刷新令牌时检索新信息。
   + 开发人员删除用户，然后用户再次登录，而没有从其 Apple ID 配置文件中删除该应用程序。

1. 请将身份提供者的属性映射到您的用户池。有关更多信息，请参阅 [有关映射的需知信息](cognito-user-pools-specifying-attribute-mapping.md#cognito-user-pools-specifying-attribute-mapping-requirements)。

1. 选择**创建**。

1. 从**应用程序客户端**菜单中，选择列表中的一个应用程序客户端，然后选择**编辑托管 UI 设置**。将新的社交身份提供商添加到 **Identity providers**（身份提供商）下的应用程序客户端。

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

## 测试社交 IdP 配置
<a name="cognito-user-pools-social-step-3"></a>

可以通过使用前两节中的元素来创建登录 URL。使用此 URL 测试社交 IdP 配置。

```
https://mydomain.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com
```

您可以在用户池 **Domain name**（域名）控制台页上找到您的域。client\$1id 位于 **App client settings**（应用程序客户端设置）页上。对于 **redirect\$1uri** 参数，使用您的回调 URL。这是页面的 URL，在页面中，您的用户在身份验证成功后将被重定向。

**注意**  
Amazon Cognito 会取消未在 5 分钟内完成的身份验证请求，并将用户重定向到托管登录。页面随即显示 `Something went wrong` 错误消息。