

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

# 将社交身份提供者与用户池配合使用
<a name="cognito-user-pools-social-idp"></a>

您的 Web 和移动应用程序用户可以通过社交身份提供者 (IdP)（例如 Facebook、Google、Amazon 和 Apple）进行登录。利用内置托管 Web UI，Amazon Cognito 将为所有经过身份验证的用户提供令牌处理和管理。这样，后端系统可以基于一组用户池令牌实现标准化。您必须启用托管登录才能与受支持的社交身份提供者集成。当 Amazon Cognito 构建您的托管登录页面时，它会创建 OAuth 2.0 个终端节点，Amazon Cognito 和您的 OIDC 以及 IdPs 社交使用这些终端节点来交换信息。有关更多信息，请参阅 [Amazon Cognito 用户池 Auth API 参考](https://docs.amazonaws.cn/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)。

你可以在中添加社交 IdP Amazon Web Services 管理控制台，也可以使用 CLI 或 Amazon Cognito AP Amazon I。

**注意**  
通过第三方（联合身份验证）进行登录可在 Amazon Cognito 用户池中实现。此功能不依赖于通过 Amazon Cognito 身份池（联合身份）实现的联合身份验证。

**Topics**
+ [设置社交 IdP 开发人员账户和应用程序](#cognito-user-pools-social-idp-step-1)
+ [使用社交 IdP 配置用户池](#cognito-user-pools-social-idp-step-2)
+ [测试社交 IdP 配置](#cognito-user-pools-social-idp-step-3)

## 设置社交 IdP 开发人员账户和应用程序
<a name="cognito-user-pools-social-idp-step-1"></a>

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

------
#### [ Facebook ]

有关 Meta 开发人员账户配置和身份验证的最新信息，请参阅 [Meta 应用程序开发](https://developers.facebook.com/docs/development)。

**如何向 Facebook/Meta 注册应用程序**

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

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

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

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

1. 在左侧导航栏上，选择 **Settings**（设置），然后选择 **Basic**（基本）。

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

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

1. 选择 **Website**（网站）。

1. 在 **Website**（网站）下，请在您的应用程序登录页面上将路径输入到 **Site URL**（站点 URL）中。

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

1. 选择 **Save changes**（保存更改）。

1. 在您的用户池域的根目录中，将路径输入到 **App Domains**（应用程序域）。

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com
   ```

1. 选择 **Save changes**（保存更改）。

1. 从导航栏中，选择 **Add Product**（添加产品），然后选择 **Facebook Login**（Facebook 登录）中的 **Set up**（设置）。

1. 从导航栏中，选择 **Facebook Login**（Facebook 登录），然后选择 **Settings**（设置）。

   在 “**有效 OAuth重定向**” 中输入您的用户池域的`/oauth2/idpresponse`终端节点路径 URIs。

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/idpresponse
   ```

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

------
#### [ Login with Amazon ]

有关 Login with Amazon 开发人员账户配置和身份验证的最新信息，请参阅 [Login with Amazon 文档](https://developer.amazon.com/docs/login-with-amazon/documentation-overview.html)。

**如何使用 Login with Amazon 注册应用程序**

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

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

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

   从页面顶部的导航栏中选择 **Apps and Services**（应用程序和服务），然后选择 **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://mydomain.auth.us-east-1.amazoncognito.com
   ```

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

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/idpresponse
   ```

1. 选择**保存**。

------
#### [ Google ]

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

**如何向 Google 注册应用程序**

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. 输入应用程序信息，**App domain**（应用程序域）、**Authorized domains**（已授权的域）和 **Developer contact information**（开发人员联系信息）。例如，您的 **Authorized domains**（已授权的域）必须包括 `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**（添加用户）。输入您的电子邮件地址和任何其他授权测试用户，然后选择 **SAVE AND CONTINUE**（保存并继续）。

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

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

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

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

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com
   ```

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

   ```
   https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/idpresponse
   ```

1. 选择 **CREATE**（创建）。

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

------
#### [ Sign in with Apple ]

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

**如何通过 Sign in with Apple（SIWA）注册应用程序**

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. 在 **Select a type**（选择类型）页面上，选择 **App**（应用程序），然后选择 **Continue**（继续）。

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-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，因为在 中选择 Apple 作为身份提供者后需要此值[使用社交 IdP 配置用户池](#cognito-user-pools-social-idp-step-2)

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

1. 从 Identifiers（标识符）页中选择您刚创建的 Services ID（服务 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://` 前缀的用户群体域。

      ```
      mydomain.auth.us-east-1.amazoncognito.com
      ```

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

      ```
      https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/idpresponse
      ```

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

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

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

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

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

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

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

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

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

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

------

## 使用社交 IdP 配置用户池
<a name="cognito-user-pools-social-idp-step-2"></a>

**要配置用户池社交 IdP，请使用 Amazon Web Services 管理控制台**

1. 转到 [Amazon Cognito 控制台](https://console.amazonaws.cn/cognito/home)。如果出现提示，请输入您的 Amazon 凭据。

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

1. 从列表中选择一个现有用户池，或创建一个用户池。

1. 选择**社交和外部提供商**菜单，然后选择**添加身份提供者**。

1. 选择一个社交 IdP：**Facebook**、**Google**（谷歌）、**Login with Amazon**（使用亚马逊账号登录）或 **Sign in with Apple**（使用苹果账号登录）。

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

1. 输入要使用的 **Authorized scopes**（授权范围）的名称。范围定义了您要通过应用程序访问的用户属性（如 `name` 和 `email`）。对于 Facebook，这些属性应用逗号分隔。对于 Google 和 Login with Amazon，则应采用空格分隔。对于 Sign in with Apple，选中要访问的范围的复选框。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/cognito/latest/developerguide/cognito-user-pools-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. 请将 IdP 的属性映射到您的用户池。有关更多信息，请参阅[指定适用于用户池的身份提供程序属性映射](https://docs.amazonaws.cn/cognito/latest/developerguide/cognito-user-pools-specifying-attribute-mapping.html)。

1. 选择**创建**。

1. 在**应用程序客户端**菜单中，从列表中选择一个应用程序客户端。要将新社交身份提供者添加到该应用程序客户端，请导航到**登录页面**选项卡，然后选择**托管登录页面配置**上的**编辑**。

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

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

在您的应用程序中，您必须在用户的客户端中调用浏览器，这样他们才能使用社交服务提供商进行登录。完成前几节中的设置过程后，使用社交服务提供商测试登录。以下示例 URL 通过前缀域加载用户池的登录页面。

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

此链接是当您转到**应用程序客户端**菜单，选择应用程序客户端，导航到**登录页面**选项卡，然后选择**查看登录页面**时，Amazon Cognito 将您引导至的页面。有关用户池域的更多信息，请参阅 [配置用户池域](cognito-user-pools-assign-domain.md)。有关应用程序客户端（包括客户端 IDs 和回调）的更多信息 URLs，请参阅[特定于应用程序的应用程序客户端设置](user-pool-settings-client-apps.md)。

以下链接示例通过 `identity_provider` 查询参数设置从[对端点授权](authorization-endpoint.md)到社交服务提供商的静默重定向。此 URL 会绕过使用托管登录的交互式用户池登录，直接转到 IdP 登录页面。

```
https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?identity_provider=Facebook|Google|LoginWithAmazon|SignInWithApple&response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com
```