

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 登入後 AWS 服務 使用身分集區存取
<a name="amazon-cognito-integrating-user-pools-with-identity-pools"></a>

當您的使用者使用使用者集區登入後，他們可以 AWS 服務 使用從身分集區發出的暫時 API 登入資料來存取 。

您的 Web 或行動應用程式會從使用者集區接收字符。當您將使用者集區設定為身分集區的身分提供者時，身分集區會交換臨時 AWS 憑證的字符。這些登入資料的範圍可以限定為 IAM 角色及其政策，以讓使用者存取一組有限的 AWS 資源。如需詳細資訊，請參閱[身分集區身分驗證流程](authentication-flow.md)。

下圖顯示應用程式如何使用使用者集區登入、擷取身分集區登入資料，以及向 請求資產 AWS 服務。

![\[使用 Amazon Cognito 使用者集區進行身分驗證並授權存取具有身分集區 AWS 之資源的應用程式流程圖。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/access-services-identity-pool.png)


您可以使用身分集區登入資料來：
+ 使用使用者自己的登入資料，向 Amazon Verified Permissions 提出精細的授權請求。
+ 連線至授權與 IAM 連線的 Amazon API Gateway REST API 或 AWS AppSync GraphQL API。
+ 連線至授權與 IAM 連線的資料庫後端，例如 Amazon DynamoDB 或 Amazon RDS。
+ 從 Amazon S3 儲存貯體擷取應用程式資產。
+ 使用 Amazon WorkSpaces 虛擬桌面啟動工作階段。

身分集區不會僅在具有使用者集區的已驗證工作階段中運作。他們也直接接受來自第三方身分提供者的身分驗證，並且可以為未驗證的訪客使用者產生登入資料。

如需使用身分集區與使用者集區群組來控制 AWS 資源存取的詳細資訊，請參閱 [新增群組至使用者集區](cognito-user-pools-user-groups.md)和 [使用以角色為基礎的存取控制](role-based-access-control.md)。此外，如需身分集區和 的詳細資訊 AWS Identity and Access Management，請參閱 [身分集區身分驗證流程](authentication-flow.md)。

## 使用 設定使用者集區 AWS 管理主控台
<a name="amazon-cognito-integrating-user-pools-with-identity-pools-setting-up"></a>

建立 Amazon Cognito 使用者集區，並記下每個用戶端應用程式的 **User Pool ID (使用者集區 ID)** 和**App Client ID (應用程式用戶端 ID)**。如需有關建立使用者集區的詳細資訊，請參閱 [使用者集區入門](getting-started-user-pools.md)。

## 使用 設定身分集區 AWS 管理主控台
<a name="amazon-cognito-integrating-user-pools-with-identity-pools-configuring"></a>

下列程序說明如何使用 AWS 管理主控台 將身分集區與一或多個使用者集區和用戶端應用程式整合。

**若要新增 Amazon Cognito 使用者集區身分提供者 (IdP)**

1. 從 [Amazon Cognito 主控台](https://console.aws.amazon.com/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>
```

您可以從**使用者集區 ID** 衍生 *<region>* 的值。例如，如果使用者集區 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)
```

------