

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

# 将 Google 设置为身份池 IdP
<a name="google"></a>

Amazon Cognito 身份池与 Google 配合使用，以便针对移动应用程序用户提供联合身份验证。本部分介绍如何使用 Google 作为 IdP 来注册和设置应用程序。

## Android
<a name="set-up-google-1.android"></a>

**注意**  
如果您的应用程序使用 Google 并且可在多个移动平台上使用，则应将 Google 配置为 [OpenID Connect 提供商](open-id.md)。将所有创建的客户添加 IDs 为其他受众值，以实现更好的集成。要了解有关 Google 跨客户端身份模式的更多信息，请参阅[跨客户端身份](https://developers.google.com/accounts/docs/CrossClientAuth)。

**设置 Google**

要激活 Google Sign-in for Android，请为应用程序创建 Google Developers 控制台项目。

1. 转到 [Google Developers 控制台](https://console.developers.google.com/)并创建一个新项目。

1. 选择**APIs 和服务**，然后选择**OAuth 同意屏幕**。自定义 Google 在征求用户同意以便与您的应用共享个人资料数据时向用户显示的信息。

1. 选择 **Credentials**（凭证），然后选择 **Create credentials**（创建凭证）。选择**OAuth 客户端 ID**。选择 **Android** 作为 **Application type**（应用程序类型）。为开发应用程序的每个平台创建单独的客户端 ID。

1. 从 **Credentials**（凭证）中，选择 **Manage service accounts**（管理服务账户）。选择 **Create service account**（创建服务账户）。输入服务账户详细信息，然后选择 **Create and continue**（创建并继续）。

1. 授予服务账户对项目的访问权限。根据应用程序的要求授予用户访问服务账户的权限。

1. 选择您的新服务账户，选择 **Keys**（密钥）选项卡，然后选择 **Add key**（添加密钥）。创建并下载新的 JSON 密钥。

有关如何使用 Google Developers 控制台的更多信息，请参阅 Google Cloud 文档中的[创建和管理项目](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。

有关如何将 Google 集成到 Android 应用程序的更多信息，请参阅 Google Identity 文档中的[使用 Sign in with Google 验证用户身份](https://developer.android.com/identity/sign-in/credential-manager-siwg)。

**添加 Google 身份提供者（IdP）**

1. 从 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)中选择**身份池**。选择身份池。

1. 选择**用户访问**选项卡。

1. 选择**添加身份提供者**。

1. 选择 **Google**。

1. 输入您在[谷歌云平台](https://console.cloud.google.com/)上创建的 OAuth 项目的**客户端 ID**。有关更多信息，请参阅 *Google 云平台控制台帮助*中的[设置 OAuth 2.0](https://support.google.com/cloud/answer/6158849)。

1. 要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色，请配置**角色设置**。

   1. 您可以为该 IdP 中的用户分配您在配置**经过身份验证的角色**时设置的**原定设置角色**，也可以**使用规则选择角色**。

     1. 如果您选择**使用规则选择角色**，请输入用户身份验证中的来源**声明**、您要用来与声明进行比较的**运算符**、导致与该角色选择匹配的**值**，以及当**角色分配**匹配时要分配的**角色**。选择**添加其他**，以根据不同的条件创建其他规则。

     1. 选择**角色解析**。当用户的声明与您的规则不匹配时，您可以拒绝凭证或为**经过身份验证的角色**颁发凭证。

1. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签，请配置**访问控制属性**。

   1. 如果不应用主体标签，请选择**非活动**。

   1. 要基于 `sub` 和 `aud` 声明应用主体标签，请选择**使用原定设置映射**。

   1. 要为主体标签创建自己的自定义属性模式，请选择**使用自定义映射**。然后，对于您要在标签中表示的每个**声明**，输入要从该声明中获取的**标签键**。

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

**使用 Google**

要在应用程序中启用 Login with Google，请按照[适用于 Android 的 Google 文档](https://developers.google.com/identity/sign-in/android/start)中的说明执行操作。当用户登录时，他们向 Google 请求 OpenID Connect 身份验证令牌。然后，Amazon Cognito 将使用该令牌对用户进行身份验证并生成一个唯一标识符。

以下示例代码显示如何从 Google Play 服务检索身份验证令牌：

```
GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
String token = GoogleAuthUtil.getToken(getApplicationContext(), accounts[0].name,
        "audience:server:client_id:YOUR_GOOGLE_CLIENT_ID");
Map<String, String> logins = new HashMap<String, String>();
logins.put("accounts.google.com", token);
credentialsProvider.setLogins(logins);
```

## iOS - Objective-C
<a name="set-up-google-1.ios-objc"></a>

**注意**  
如果您的应用程序使用 Google 并且可在多个移动平台上使用，则应将 Google 配置为 [OpenID Connect 提供商](open-id.md)。将所有创建的客户添加 IDs 为其他受众值，以实现更好的集成。要了解有关 Google 跨客户端身份模式的更多信息，请参阅[跨客户端身份](https://developers.google.com/accounts/docs/CrossClientAuth)。

**设置 Google**

要启用 Google Sign-in for iOS，请为应用程序创建 Google Developers 控制台项目。

1. 转到 [Google Developers 控制台](https://console.developers.google.com/)并创建一个新项目。

1. 选择**APIs 和服务**，然后选择**OAuth 同意屏幕**。自定义 Google 在征求用户同意以便与您的应用共享个人资料数据时向用户显示的信息。

1. 选择 **Credentials**（凭证），然后选择 **Create credentials**（创建凭证）。选择**OAuth 客户端 ID**。选择 **iOS** 作为 **Application type**（应用程序类型）。为开发应用程序的每个平台创建单独的客户端 ID。

1. 从 **Credentials**（凭证）中，选择 **Manage service accounts**（管理服务账户）。选择 **Create service account**（创建服务账户）。输入服务账户详细信息，然后选择 **Create and continue**（创建并继续）。

1. 授予服务账户对项目的访问权限。根据应用程序的要求授予用户访问服务账户的权限。

1. 选择您的新服务账户。选择 **Keys**（密钥）选项卡，然后选择 **Add key**（添加密钥）。创建并下载新的 JSON 密钥。

有关如何使用 Google Developers 控制台的更多信息，请参阅 Google Cloud 文档中的[创建和管理项目](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。

有关将 Google 集成到 iOS 应用程序的更多信息，请参阅 Google Identity 文档中的 [Google Sign-In for iOS](https://developers.google.com/identity/sign-in/ios/start-integrating)。

**添加 Google 身份提供者（IdP）**

1. 从 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)中选择**身份池**。选择身份池。

1. 选择**用户访问**选项卡。

1. 选择**添加身份提供者**。

1. 选择 **Google**。

1. 输入您在[谷歌云平台](https://console.cloud.google.com/)上创建的 OAuth 项目的**客户端 ID**。有关更多信息，请参阅 *Google 云平台控制台帮助*中的[设置 OAuth 2.0](https://support.google.com/cloud/answer/6158849)。

1. 要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色，请配置**角色设置**。

   1. 您可以为该 IdP 中的用户分配您在配置**经过身份验证的角色**时设置的**原定设置角色**，也可以**使用规则选择角色**。

     1. 如果您选择**使用规则选择角色**，请输入用户身份验证中的来源**声明**、您要用来与声明进行比较的**运算符**、导致与该角色选择匹配的**值**，以及当**角色分配**匹配时要分配的**角色**。选择**添加其他**，以根据不同的条件创建其他规则。

     1. 选择**角色解析**。当用户的声明与您的规则不匹配时，您可以拒绝凭证或为**经过身份验证的角色**颁发凭证。

1. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签，请配置**访问控制属性**。

   1. 如果不应用主体标签，请选择**非活动**。

   1. 要基于 `sub` 和 `aud` 声明应用主体标签，请选择**使用原定设置映射**。

   1. 要为主体标签创建自己的自定义属性模式，请选择**使用自定义映射**。然后，对于您要在标签中表示的每个**声明**，输入要从该声明中获取的**标签键**。

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

**使用 Google**

要在应用程序中启用“用 Google 登录”，请按照[适用于 iOS 的 Google 文档](https://developers.google.com/identity/sign-in/ios/start/)中的说明执行操作。成功通过身份验证后，将生成一个 OpenID Connect 身份验证令牌，供 Amazon Cognito 用于对用户进行身份验证并生成一个唯一标识符。

成功通过身份验证后，将生成一个 `GTMOAuth2Authentication` 对象，其中包含一个 `id_token`，供 Amazon Cognito 用于对用户进行身份验证并生成一个唯一标识符：

```
- (void)finishedWithAuth: (GTMOAuth2Authentication *)auth error: (NSError *) error {
        NSString *idToken = [auth.parameters objectForKey:@"id_token"];
        credentialsProvider.logins = @{ @(AWSCognitoLoginProviderKeyGoogle): idToken };
    }
```

## iOS - Swift
<a name="set-up-google-1.ios-swift"></a>

**注意**  
如果您的应用程序使用 Google 并且可在多个移动平台上使用，则应将 Google 配置为 [OpenID Connect 提供商](open-id.md)。将所有创建的客户添加 IDs 为其他受众值，以实现更好的集成。要了解有关 Google 跨客户端身份模式的更多信息，请参阅[跨客户端身份](https://developers.google.com/accounts/docs/CrossClientAuth)。

**设置 Google**

要启用 Google Sign-in for iOS，请为应用程序创建 Google Developers 控制台项目。

1. 转到 [Google Developers 控制台](https://console.developers.google.com/)并创建一个新项目。

1. 选择**APIs 和服务**，然后选择**OAuth 同意屏幕**。自定义 Google 在征求用户同意以便与您的应用共享个人资料数据时向用户显示的信息。

1. 选择 **Credentials**（凭证），然后选择 **Create credentials**（创建凭证）。选择**OAuth 客户端 ID**。选择 **iOS** 作为 **Application type**（应用程序类型）。为开发应用程序的每个平台创建单独的客户端 ID。

1. 从 **Credentials**（凭证）中，选择 **Manage service accounts**（管理服务账户）。选择 **Create service account**（创建服务账户）。输入服务账户详细信息，然后选择 **Create and continue**（创建并继续）。

1. 授予服务账户对项目的访问权限。根据应用程序的要求授予用户访问服务账户的权限。

1. 选择您的新服务账户，选择 **Keys**（密钥）选项卡，然后选择 **Add key**（添加密钥）。创建并下载新的 JSON 密钥。

有关如何使用 Google Developers 控制台的更多信息，请参阅 Google Cloud 文档中的[创建和管理项目](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。

有关将 Google 集成到 iOS 应用程序的更多信息，请参阅 Google Identity 文档中的 [Google Sign-In for iOS](https://developers.google.com/identity/sign-in/ios/start-integrating)。

在 [Amazon Cognito 控制台主页](https://console.aws.amazon.com/cognito/home)中选择 **Manage Identity Pools**（管理身份池）：

**在 Amazon Cognito 控制台中配置外部提供商**

1. 选择想要在其中启用 Google 作为外部提供商的身份池的名称。此时将显示身份池的 **Dashboard**（控制面板）页。

1. 在**控制面板**页面的右上角，选择 **Edit identity pool (编辑身份池)**。此时将显示“Edit identity pool”（编辑身份池）页。

1. 向下滚动并选择 **Authentication providers**（身份验证提供商）以展开这一部分。

1. 选择 **Google** 选项卡。

1. 选择 **Unlock**（解锁）。

1. 输入从 Google 获取的 Google 客户端 ID，然后选择 **Save Changes**（保存更改）。

**使用 Google**

要在应用程序中启用“用 Google 登录”，请按照[适用于 iOS 的 Google 文档](https://developers.google.com/identity/sign-in/ios/start/)中的说明执行操作。成功通过身份验证后，将生成一个 OpenID Connect 身份验证令牌，供 Amazon Cognito 用于对用户进行身份验证并生成一个唯一标识符。

成功的身份验证会生成一个包含 `id_token` 的 `GTMOAuth2Authentication` 对象。Amazon Cognito 使用此令牌对用户进行身份验证并生成一个唯一标识符：

```
func finishedWithAuth(auth: GTMOAuth2Authentication!, error: NSError!) {
    if error != nil {
      print(error.localizedDescription)
    }
    else {
      let idToken = auth.parameters.objectForKey("id_token")
      credentialsProvider.logins = [AWSCognitoLoginProviderKey.Google.rawValue: idToken!]
    }
}
```

## JavaScript
<a name="set-up-google-1.javascript"></a>

**注意**  
如果您的应用程序使用 Google 并且可在多个移动平台上使用，则应将 Google 配置为 [OpenID Connect 提供商](open-id.md)。将所有创建的客户添加 IDs 为其他受众值，以实现更好的集成。要了解有关 Google 跨客户端身份模式的更多信息，请参阅[跨客户端身份](https://developers.google.com/accounts/docs/CrossClientAuth)。

**设置 Google**

要为 JavaScript 网络应用程序启用 Google 登录，请为您的应用程序创建 Google 开发者控制台项目。

1. 转到 [Google Developers 控制台](https://console.developers.google.com/)并创建一个新项目。

1. 选择**APIs 和服务**，然后选择**OAuth 同意屏幕**。自定义 Google 在征求用户同意以便与您的应用共享个人资料数据时向用户显示的信息。

1. 选择 **Credentials**（凭证），然后选择 **Create credentials**（创建凭证）。选择**OAuth 客户端 ID**。选择 **Web application**（Web 应用程序）作为 **Application type**（应用程序类型）。为开发应用程序的每个平台创建单独的客户端 ID。

1. 从 **Credentials**（凭证）中，选择 **Manage service accounts**（管理服务账户）。选择 **Create service account**（创建服务账户）。输入服务账户详细信息，然后选择 **Create and continue**（创建并继续）。

1. 授予服务账户对项目的访问权限。根据应用程序的要求授予用户访问服务账户的权限。

1. 选择您的新服务账户，选择 **Keys**（密钥）选项卡，然后选择 **Add key**（添加密钥）。创建并下载新的 JSON 密钥。

有关如何使用 Google Developers 控制台的更多信息，请参阅 Google Cloud 文档中的[创建和管理项目](https://cloud.google.com/resource-manager/docs/creating-managing-projects)。

有关如何将 Google 集成到 Web 应用程序的更多信息，请参阅 Google Identity 文档中的[使用 Google 登录](https://developers.google.com/identity/gsi/web/guides/overview)。

**在 Amazon Cognito 控制台中配置外部提供商**

**添加 Google 身份提供者（IdP）**

1. 从 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)中选择**身份池**。选择身份池。

1. 选择**用户访问**选项卡。

1. 选择**添加身份提供者**。

1. 选择 **Google**。

1. 输入您在[谷歌云平台](https://console.cloud.google.com/)上创建的 OAuth 项目的**客户端 ID**。有关更多信息，请参阅 *Google 云平台控制台帮助*中的[设置 OAuth 2.0](https://support.google.com/cloud/answer/6158849)。

1. 要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色，请配置**角色设置**。

   1. 您可以为该 IdP 中的用户分配您在配置**经过身份验证的角色**时设置的**原定设置角色**，也可以**使用规则选择角色**。

     1. 如果您选择**使用规则选择角色**，请输入用户身份验证中的来源**声明**、您要用来与声明进行比较的**运算符**、导致与该角色选择匹配的**值**，以及当**角色分配**匹配时要分配的**角色**。选择**添加其他**，以根据不同的条件创建其他规则。

     1. 选择**角色解析**。当用户的声明与您的规则不匹配时，您可以拒绝凭证或为**经过身份验证的角色**颁发凭证。

1. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签，请配置**访问控制属性**。

   1. 如果不应用主体标签，请选择**非活动**。

   1. 要基于 `sub` 和 `aud` 声明应用主体标签，请选择**使用原定设置映射**。

   1. 要为主体标签创建自己的自定义属性模式，请选择**使用自定义映射**。然后，对于您要在标签中表示的每个**声明**，输入要从该声明中获取的**标签键**。

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

**使用 Google**

要在应用程序中启用“用 Google 登录”，请按照[适用于 Web 的 Google 文档](https://developers.google.com/identity/gsi/web/guides/overview)中的说明执行操作。

成功通过身份验证后，将生成一个响应对象，其中包含一个 `id_token`，供 Amazon Cognito 用于对用户进行身份验证并生成一个唯一标识符：

```
function signinCallback(authResult) {
  if (authResult['status']['signed_in']) {

     // Add the Google access token to the Amazon Cognito credentials login map.
     AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: 'IDENTITY_POOL_ID',
        Logins: {
           'accounts.google.com': authResult['id_token']
        }
     });

     // Obtain AWS credentials
     AWS.config.credentials.get(function(){
        // Access AWS resources here.
     });
  }
}
```