

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

# 登录后 Amazon Web Services 服务 使用身份池进行访问
<a name="amazon-cognito-integrating-user-pools-with-identity-pools"></a>

用户使用用户池登录后，他们可以使用身份池颁发的临时 API 凭证进行访问 Amazon Web Services 服务 。

您的 Web 应用程序或移动应用程序接收来自用户池的令牌。当您将用户池配置为身份池的身份提供者时，身份池会用令牌交换临时 Amazon 证书。这些证书的范围可以限于 IAM 角色及其策略，这些策略允许用户访问有限的 Amazon 资源。有关更多信息，请参阅 [身份池身份验证流程](authentication-flow.md)。

下图显示了应用程序如何使用用户池登录、检索身份池凭证以及如何从 Amazon Web Services 服务请求资产。

![\[使用 Amazon Cognito 用户池进行身份验证并使用身份池授权 Amazon 访问资源的应用程序流程图。\]](http://docs.amazonaws.cn/cognito/latest/developerguide/images/access-services-identity-pool.png)


您可以使用身份池凭证来完成以下操作：
+ 使用用户自己的凭证向 Amazon Verified Permissions 提出精细的授权请求。
+ 连接到 Amazon API Gateway REST API 或授权与 IAM 连接的 Amazon AppSync GraphQL API。
+ 连接到使用 IAM 授权连接的数据库后端，例如 Amazon DynamoDB 或 Amazon RDS。
+ 从 Amazon S3 存储桶检索应用程序资产。
+ 使用 Amazon WorkSpaces 虚拟桌面启动会话。

身份池不仅在经过用户池认证的会话中运行。它们还直接接受来自第三方身份提供者的身份验证，并且可为未经身份验证的访客用户生成凭证。

有关使用身份池和用户池组来控制对 Amazon 资源的访问的更多信息，请参阅[向用户池添加组](cognito-user-pools-user-groups.md)和[使用基于角色的访问控制](role-based-access-control.md)。另外，有关身份池和的更多信息 Amazon Identity and Access Management，请参阅[身份池身份验证流程](authentication-flow.md)。

## 使用设置用户池 Amazon Web Services 管理控制台
<a name="amazon-cognito-integrating-user-pools-with-identity-pools-setting-up"></a>

创建 Amazon Cognito 用户池并记下每个客户端应用程序的**用户池 ID** 和**应用程序客户端 ID**。有关创建用户池的更多信息，请参阅[用户池入门](getting-started-user-pools.md)。

## 使用设置身份池 Amazon Web Services 管理控制台
<a name="amazon-cognito-integrating-user-pools-with-identity-pools-configuring"></a>

以下过程介绍如何使用将 Amazon Web Services 管理控制台 身份池与一个或多个用户池和客户端应用程序集成。

**添加 Amazon Cognito 用户池身份提供者 (IdP)**

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

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

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

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

1. 输入**用户池 ID** 和**应用程序客户端 ID**。

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

   1. 您可以为该 IdP 中的用户分配您在配置**经过身份验证的角色**时设置的**原定设置角色**，也可以**使用规则选择角色**。使用 Amazon Cognito 用户池 IdP，还可以**选择令牌中包含 preferred\$1role 声明的角色**。有关 `cognito:preferred_role` 声明的更多信息，请参阅[将优先级值分配到组](cognito-user-pools-user-groups.md#assigning-precedence-values-to-groups)。

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

      1. 如果您选择**选择令牌中有 preferred\$1role 声明的角色**，Amazon Cognito 会在您的用户的 `cognito:preferred_role` 声明中为该角色发放凭证。如果不存在首选角色声明，Amazon Cognito 将根据您的**角色解析**发放凭证。

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

1. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签，请配置**访问控制属性**。
   + 如果不应用主体标签，请选择**非活动**。
   + 要基于 `sub` 和 `aud` 声明应用主体标签，请选择**使用原定设置映射**。
   + 要为主体标签创建自己的自定义属性模式，请选择**使用自定义映射**。然后，对于您要在标签中表示的每个**声明**，输入要从该声明中获取的**标签键**。

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

## 将用户池与身份池集成
<a name="amazon-cognito-integrating-user-pools-with-identity-pools-using"></a>

对您的应用程序用户进行身份验证后，将用户的身份令牌添加到凭证提供程序中的登录映射中。提供商名称取决于 Amazon Cognito 用户池 ID。结构如下所示：

```
cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>
```

您可以*<region>*从**用户池 ID** 中推导出值。例如，如果用户池 ID 为`us-east-1_EXAMPLE1`，则*<region>*为`us-east-1`。如果用户池 ID 为`us-west-2_EXAMPLE2`，则*<region>*为`us-west-2`。

------
#### [ JavaScript ]

```
var cognitoUser = userPool.getCurrentUser();

if (cognitoUser != null) {
	cognitoUser.getSession(function(err, result) {
		if (result) {
			console.log('You are now logged in.');

			// Add the User's Id Token to the Cognito credentials login map.
			AWS.config.credentials = new AWS.CognitoIdentityCredentials({
				IdentityPoolId: 'YOUR_IDENTITY_POOL_ID',
				Logins: {
					'cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>': result.getIdToken().getJwtToken()
				}
			});
		}
	});
}
```

------
#### [ Android ]

```
cognitoUser.getSessionInBackground(new AuthenticationHandler() {
	@Override
	public void onSuccess(CognitoUserSession session) {
		String idToken = session.getIdToken().getJWTToken();

		Map<String, String> logins = new HashMap<String, String>();
		logins.put("cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>", session.getIdToken().getJWTToken());
		credentialsProvider.setLogins(logins);
	}

});
```

------
#### [ iOS - objective-C ]

```
AWSServiceConfiguration *serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:nil];
AWSCognitoIdentityUserPoolConfiguration *userPoolConfiguration = [[AWSCognitoIdentityUserPoolConfiguration alloc] initWithClientId:@"YOUR_CLIENT_ID"  clientSecret:@"YOUR_CLIENT_SECRET" poolId:@"YOUR_USER_POOL_ID"];
[AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration userPoolConfiguration:userPoolConfiguration forKey:@"UserPool"];
AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:@"UserPool"];
AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"YOUR_IDENTITY_POOL_ID" identityProviderManager:pool];
```

------
#### [ iOS - swift ]

```
let serviceConfiguration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: nil)
let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET", poolId: "YOUR_USER_POOL_ID")
AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: userPoolConfiguration, forKey: "UserPool")
let pool = AWSCognitoIdentityUserPool(forKey: "UserPool")
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "YOUR_IDENTITY_POOL_ID", identityProviderManager:pool)
```

------