

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

# 身分集區的範例應用程式
<a name="getting-started-identity-pools-application"></a>

Amazon Cognito 身分集區的最常見使用案例是聯合來自多個登入系統的使用者，並將臨時、有限存取的 AWS 登入資料直接交付給用戶端。這樣就不需要為存取 AWS 資源的許可建置登入資料代理程式。例如，您可能需要讓使用者使用其社交媒體帳戶登入，並從 Amazon S3 存取行動應用程式的應用程式資產。身分集區也會將登入資料提供給使用使用者集區登入的使用者。

在本教學課程中，您將建立一個 Web 應用程式，您可以在增強型和基本[身分驗證流程中](authentication-flow.md)，透過身分集區中支援的身分提供者 (IdPs) 取得暫時驗證和訪客登入資料。如果您已在 Web 開發方面有經驗，請從 GitHub 下載範例應用程式。

[從 GitHub 下載範例應用程式](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/cognito/scenarios/identity_pools_example_demo/web)

此範例應用程式示範 Amazon Cognito 身分集區的下列功能：

**身分集區中的身分驗證流程**  
+ 具有詳細 API 請求明細的增強型身分驗證流程
+ 具有詳細 API 請求明細的基本身分驗證流程

**實作訪客 （未驗證） 存取**  
+ 提供有限的 AWS 服務 存取，而不需要登入

**與支援的身分提供者整合**  
+ 用於消費者存取的社交 IdPs (Facebook、Amazon、Twitter、Apple 和 Google)
+ 企業使用者的企業 IdPs（透過 OpenID Connect 或 SAML)
+ Amazon Cognito 使用者集區

**AWS 登入資料管理**  
+ 交換臨時 AWS 登入資料的身分提供者字符
+ 使用臨時登入資料安全地存取 AWS 服務

在開發 Web 伺服器上設定應用程式並在瀏覽器中存取應用程式後，您會看到下列選項。

![\[Amazon Cognito 身分集區示範應用程式 Web 界面的螢幕擷取畫面，顯示具有身分驗證方法選項和互動式示範區段的主頁面。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/amazon-cognito-identity-pool-demo-app.png)


**Topics**
+ [先決條件](#demo-prerequisites)
+ [身分驗證提供者設定](#demo-authentication-provider-setup)
+ [部署示範應用程式](#demo-deploy-application)
+ [探索身分集區中的身分驗證方法](#explore-authentication-methods-in-identity-pools-application)
+ [後續步驟](#next-steps)

## 先決條件
<a name="demo-prerequisites"></a>

在開始之前，您將需要設定下列資源。
+ 可存取 Amazon Cognito AWS 的帳戶。如果您沒有 AWS 帳戶，請遵循 中的指示[入門 AWS](cognito-getting-started-account-iam.md)。
+ 您的開發機器上安裝 Python 3.8 或更新版本。
+ GitHub 存取。
+ AWS 已設定登入資料，具有對 Amazon Cognito APIs 提出已驗證請求的許可。[開發人員身分驗證](authentication-flow.md#authentication-flow-developer)需要這些登入資料。

如需在特定 SDK 中實作 AWS 登入資料和身分集區聯合的詳細資訊，請參閱 [取得憑證](getting-credentials.md)。

## 身分驗證提供者設定
<a name="demo-authentication-provider-setup"></a>

為了取得此應用程式的最佳結果，請設定並整合一或多個第三方身分提供者 (IdPs) 或 Amazon Cognito 使用者集區與您的 Amazon Cognito 身分集區。在您完成先決條件，並在執行此示範應用程式之前，選擇要設定的身分提供者。[Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/v2/identity/identity-pools)會逐步引導您設定身分集區和提供者的程序。

**Amazon Cognito 使用者集區**  
+ [使用 Amazon Cognito 使用者集區進行身分驗證](authentication.md)
+ [使用應用程式用戶端的應用程式特定設定](user-pool-settings-client-apps.md)

**社交身分提供者**  
+ Google： [將 Google 設定為身分集區 IdP](google.md)
+ Facebook： [將 Facebook 設定為身分集區 IdP](facebook.md)
+ Amazon： [將 Login with Amazon 設定為身分集區 IdP](amazon.md)

**OpenID Connect (OIDC) 供應商**  
+ [將 OIDC 供應商設定為身分集區 IdP](open-id.md)

**SAML 供應商**  
+ [將 SAML 供應商設定為身分集區 IdP](saml-identity-provider.md)

**注意**  
對於此示範應用程式，您不需要設定所有支援的身分提供者。您可以從符合您使用案例的 開始。每個連結都提供詳細的組態指示。

## 部署示範應用程式
<a name="demo-deploy-application"></a>

### 複製儲存庫
<a name="demo-step-1-clone-repository"></a>

1. 開啟終端機視窗。

1. 複製`aws-doc-sdk-examples`儲存庫，或在[儲存庫中擷取此資料夾](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/cognito/scenarios/identity_pools_example_demo/web)。

   ```
   git clone https://github.com/awsdocs/aws-doc-sdk-examples.git
   ```

1. 導覽至 專案目錄。

   ```
   cd python/example_code/cognito/scenarios/identity_pools_example_demo/web
   ```

### 建立 身分集區
<a name="demo-step-2-create-identity-pool"></a>

若要為您的應用程式建立 Amazon Cognito 身分集區，請遵循 中的指示[身分集區主控台概觀](identity-pools.md)。

**設定示範應用程式的身分集區**

1. 開啟 Amazon Cognito [主控台](https://console.aws.amazon.com/cognito/home)。

1. 從左側導覽功能表中，選擇**身分集區**。選擇現有的身分集區，或建立新的身分集區。

1. 在**使用者存取**下，啟用**已驗證存取**和**訪客存取**。設定新的或現有的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp.html)，並[為其指派您要授予每種使用者類型的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-permissions.html)。

1. 在**使用者存取**下，設定您要設定的任何身分提供者。

1. 在**身分集區屬性**下，啟用**基本 （傳統） 身分驗證**。

1. 保持瀏覽器開啟至您身分集區的 主控台。您會在應用程式設定中使用身分集區 ID 和其他組態資訊。

### 設定和執行應用程式
<a name="demo-step-3-configure-run-application"></a>

下列步驟會引導您完成示範應用程式的初始設定。

**設定示範應用程式**

1. 在`aws-doc-sdk-examples`複製`python/example_code/cognito/scenarios/identity_pools_example_demo/web`中開啟命令列。

1. 透過複製範例環境`.env`檔案來建立檔案。 [https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/python/example_code/cognito/scenarios/identity_pools_example_demo/web/.env.example](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/python/example_code/cognito/scenarios/identity_pools_example_demo/web/.env.example)

   ```
   cp .env.example .env
   ```

1. 在文字編輯器中開啟 `.env` 檔案。將 檔案中的範例值取代為您自己的組態值。

1. 安裝後端相依性。

   ```
   pip install -r requirements.txt
   ```

1. 啟動後端伺服器：

   ```
   cd backend 
   python oauth_server.py
   ```

1. 開啟新的終端機視窗，導覽至專案目錄並啟動前端伺服器：

   ```
   cd frontend
   python -m http.server 8001
   ```

1. 在 [http：//localhost：8001](http://localhost:8001) 開啟瀏覽器至應用程式。您的瀏覽器會顯示示範應用程式界面，準備好測試身分集區身分驗證。

## 探索身分集區中的身分驗證方法
<a name="explore-authentication-methods-in-identity-pools-application"></a>

本節使用 Amazon Cognito 身分集區示範應用程式，引導您完成基本和增強型身分驗證流程。透過此示範，您將了解身分集區如何與各種身分提供者搭配使用，為您的應用程式使用者提供臨時 AWS 憑證。

在範例應用程式的**互動式示範**區段中，您會先在身分集區支援的兩種存取類型之間進行選擇。

**[未驗證的 （訪客） 存取](#unauthenticated-access)**  
提供 AWS 登入資料給尚未驗證的使用者。

**已驗證的存取**  
具有完整可用許可範圍之 AWS 登入資料的交換身分提供者字符。從您在 `.env` 檔案中設定的身分提供者中選擇身分提供者。

## 未驗證的 （訪客） 存取
<a name="unauthenticated-access"></a>

此步驟示範如何透過身分集區的訪客存取功能，取得未經驗證 （訪客） 使用者的臨時 AWS 登入資料。在示範應用程式中，您將測試增強型和基本流程，以了解身分集區如何發行登入資料，而不需要使用者登入。訪客存取使用與已驗證存取相同的 API 序列，但不提供身分提供者字符 （例如來自 Google、Facebook 的 OAuth 字符，或來自企業提供者的 SAML 聲明）。

如果您正在尋找有關為使用者提供有限 AWS 存取權的資訊，而不需要身分驗證，請繼續閱讀。實作訪客存取後，您將了解如何安全地提供 AWS 登入資料給匿名使用者，並了解兩個身分驗證流程之間的差異。

**重要**  
未經驗證的存取可以向具有網際網路存取的任何人發出登入資料，因此最適合用於需要最低安全性 AWS 的資源，例如公有 APIs和圖形資產。在繼續此步驟之前，請檢查是否已在啟用訪客存取的情況下設定身分集區，並確保有適當的 IAM 政策來限制許可。

------
#### [ Guest access with enhanced flow ]

增強型流程是一種簡化的方法，可為具有兩個 API 請求的未驗證使用者取得 AWS 憑證。

**使用增強的流程測試訪客存取**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**訪客存取**索引標籤。

1. 選擇**增強型流程**索引標籤。

1. 選擇**測試訪客存取**。

1. 應用程式會從您的身分集區取得臨時 AWS 登入資料，而不需要額外的身分驗證提示。

1. 身分驗證成功後，您將看到顯示**結果**面板的 Web 界面，並且您有兩個選項可以探索它們：

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-07T00:58:21-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      + `GetId()` 使用 提出 API 請求`identityPoolId`。訪客存取不需要身分驗證字符

        ```
        {
          "IdentityPoolId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
        ```

        如果有效，它會尋找或建立並傳回使用者的 `IdentityID`。範例回應如下所示：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
        ```
      + `GetCredentialsForIdentity()` 與傳回的 `identityPoolId`。

        ```
        POST GetCredentialsForIdentity
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
        ```

        Cognito 會驗證訪客存取、使用 在內部擔任未經驗證的角色 AWS STS，並傳回暫時 AWS 登入資料。（此呼叫沒有 IAM 身分驗證；角色信任必須允許 `cognito-identity-amazonzaws.com`。)

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
          "Credentials": {
            "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
            "Expiration": "2025-08-07T00:58:21-07:00"
          }
        }
        ```

------
#### [ Guest access with basic flow ]

基本流程提供對身分擷取和憑證產生之個別 API 請求的身分驗證程序的精細控制。

**使用基本流程測試訪客存取**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**訪客存取**索引標籤。

1. 選擇**基本流程**索引標籤。

1. 選擇**測試訪客存取**。

1. 應用程式會從您的身分集區取得臨時 AWS 憑證，而不需要額外的身分驗證提示。

1. 身分驗證成功後，您將看到顯示**結果**面板的 Web 界面，並且您有兩個選項可以探索它們。

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-12T13:36:17-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      +  `GetId()` 具有您的身分集區 ID 的 API 請求。訪客存取不需要身分驗證字符。

        ```
        POST GetId
        {
          "IdentityPoolId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
        ```

        如果有效，它會尋找或建立並傳回使用者的 `IdentityID`。範例回應如下所示：

        ```
        {
           "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```
      +  `GetOpenIdToken()` 與傳回的 `IdentityID`和相同的`Logins`映射

        ```
        POST GetOpenIdToken
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Token": "eyJraWQiOiJFWAMPLE......"
        }
        ```

        **此步驟中發生的情況：**Amazon Cognito 會從 cognito-identity.amazonaws.com 發出代表此 的短期 OpenID Connect Web 身分字符`IdentityId`。權杖包含 AWS STS 評估的 OIDC 宣告，包括 aud （您的身分集區 ID) 和 amr （已驗證或未驗證）。IAM 角色的信任政策必須要求這些宣告。
      +  `AssumeRoleWithWebIdentity()` - 您的應用程式 AWS STS 會直接呼叫 ，以交換 Amazon Cognito OpenID 字符做為臨時 AWS 登入資料

        ```
        POST sts:AssumeRoleWithWebIdentity
        {
          "RoleArn": "arn:aws:iam::111122223333:role/Cognito_IdentityPoolUnauth_Role",
          "WebIdentityToken": "eyJraWQiOiJFWAMPLE......"
        }
        ```

        回應：

        ```
        {
          "Credentials": {
            "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "FwoGZXIvYXdzEEXAMPLE......"
          }
        }
        ```

        **此步驟中發生的情況：**驗證後： 會傳回臨時 AWS 登入資料

------

### 使用暫時登入資料
<a name="use-temporary-credentials"></a>

這些臨時登入資料可作為標準 AWS 登入資料，但具有身分集區未經驗證的 IAM 角色所定義的有限許可。您可以搭配任何 AWS SDK 或 使用它們 AWS CLI。如需使用登入資料設定 AWS SDKs 的詳細資訊，請參閱《 AWS SDKs和工具參考指南》中的[標準化登入資料提供者](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html)。

以下範例並非完整清單，但顯示身分集區的訪客功能改善使用者體驗的常見方式。

#### 公有唯讀內容
<a name="public-content"></a>

下列範例會將登入資料提供者設定為訪客使用者的有限 Amazon S3 存取。

------
#### [ Python ]

```
# Example: Using credentials with boto3
import boto3

# Configure client with temporary credentials
s3_client = boto3.client(
    's3',
    aws_access_key_id='AKIAIOSFODNN7EXAMPLE',
    aws_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
    aws_session_token='IQoJb3JpZ2luX2VjEEXAMPLE......'
)

# Make API requests within IAM role permissions
response = s3_client.list_objects_v2(Bucket='my-public-bucket')

# Access public content
for obj in response.get('Contents', []):
    print(f"File: {obj['Key']}, Size: {obj['Size']} bytes")
```

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

```
// Example: Accessing public content
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";

const s3Client = new S3Client({
    region: "us-east-1",
    credentials: {
        accessKeyId: 'AKIAIOSFODNN7EXAMPLE',
        secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
        sessionToken: 'IQoJb3JpZ2luX2VjEEXAMPLE......'
    }
});

// Access public images or documents
const response = await s3Client.send(new GetObjectCommand({
    Bucket: 'my-public-content',
    Key: 'product-catalog.pdf'
}));
```

------

### 「Try-before-login」功能
<a name="try-before-login"></a>

下列範例以訪客使用者身分使用 Amazon DynamoDB 的唯讀存取權。

------
#### [ Python ]

```
# Example: Limited app functionality for trial users
import boto3

dynamodb = boto3.client(
    'dynamodb',
    aws_access_key_id='AKIAIOSFODNN7EXAMPLE',
    aws_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
    aws_session_token='IQoJb3JpZ2luX2VjEEXAMPLE......'
)

# Allow guest users to view sample data (limited to 5 items)
response = dynamodb.scan(TableName='SampleProducts', Limit=5)
```

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

```
// Example: Limited app functionality for trial users
import { DynamoDBClient, ScanCommand } from "@aws-sdk/client-dynamodb";

const dynamodbClient = new DynamoDBClient({
    region: "us-east-1",
    credentials: {
        accessKeyId: 'AKIAIOSFODNN7EXAMPLE',
        secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
        sessionToken: 'IQoJb3JpZ2luX2VjEEXAMPLE......'
    }
});

// Allow guest users to view sample data (limited to 5 items)
const response = await dynamodbClient.send(new ScanCommand({
    TableName: 'SampleProducts',
    Limit: 5
}));
```

------

## 社交身分提供者身分驗證
<a name="social-identity-provider-authentication"></a>

此步驟會探索搭配 Amazon Cognito 身分集區使用社交身分提供者的整體流程。社交身分驗證提供熟悉的登入體驗，同時透過聯合身分管理來維護安全性。您可以從 Google、Facebook 和 Amazon 等社交身分提供者 (IdP) 登入，然後將該 IdP 字符交換為臨時 AWS 憑證。身分集區也支援 Twitter 和 Apple 整合，但在範例應用程式中不支援。

身分集區本身不是使用者目錄。它不會存放密碼或設定檔欄位。相反地，它信任外部 IdPs 來驗證使用者，並專注於透過為 IAM 角色提供憑證，授權已驗證的使用者直接呼叫 AWS 服務。

------
#### [ Social identity provider with enhanced flow ]

本節說明如何使用社交身分提供者登入使用者，並使用增強型流程，在 Amazon Cognito 身分集區中交換提供者字符，以請求 AWS 資源。

**使用社交登入搭配範例應用程式中的增強流程**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**已驗證存取**索引標籤。

1. 選擇**增強型流程**索引標籤。

1. 選擇您已設定的支援社交供應商，例如**使用 Google 登入**、**使用 Facebook 登入**或**使用 Amazon 登入**。

1. 登入並同意與應用程式共用使用者資料。

1. 供應商重新導向回應用程式的重新導向 URI

1. 應用程式會將提供者字符傳送至您的身分集區，並擷取臨時 AWS 憑證

1. 應用程式會在 Web 介面中顯示**結果**面板。

   身分驗證成功後，您會看到顯示**結果**面板的 Web 界面，而且您有兩個選項可以探索它們：

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-12T13:36:17-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      +  應用程式使用社交 IdP 登入使用者，並取得提供者字符。身分集區接受來自社交提供者的這些成品：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/getting-started-identity-pools-application.html)

        與社交供應商成功進行身分驗證後，您的應用程式會收到 OAuth 回應，其中包含存取字符和其他身分驗證詳細資訊：

        ```
        {
           "access_token": "ya29.A0AS3H6NEXAMPLE......",
           "expires_in": 3599,
           "scope": "openid https://www.examplesocial....",
           "token_type": "Bearer",
           "id_token": "eyJhbGciOiJSUzI1NiIsEXAMPLE......"
        }
        ```
      +  `GetId()` 具有身分集區 ID 的 API 請求，以及包含社交供應商字符的`Logins`映射

        ```
        POST GetId
        {
          "IdentityPoolId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
          "Logins": {
            "accounts.google.com": "eyJhbGciOiJSUzI1NiIsEXAMPLE......"
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```
      + `GetCredentialsForIdentity()` 與傳回的 `IdentityID`和相同的`Logins`映射

        ```
        POST GetCredentialsForIdentity
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Logins": {
            "accounts.google.com": "eyJhbGciOiJSUzI1NiIsEXAMPLE......"
          }
        }
        ```

        回應：

        ```
        {
          "Credentials": {
            "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
            "Expiration": "2025-08-07T00:58:21-07:00"
          },
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```

**發生的情況**：Amazon Cognito 會根據設定的提供者驗證權杖、根據您的提供者組態選擇 IAM 角色，以及 AWS STS 代表您呼叫 。然後，您的身分集區會傳回暫時登入資料。

------
#### [ Social identity provider with basic flow ]

本節說明如何使用社交身分提供者來登入使用者，並使用基本流程，在 Amazon Cognito 身分集區中交換提供者字符，以取得臨時憑證以呼叫 AWS 服務。

**使用社交登入搭配範例應用程式中的基本流程**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**已驗證的存取**索引標籤。

1. 選擇**基本流程**索引標籤。

1. 選擇您已設定的支援社交供應商，例如**使用 Google 登入**、**使用 Facebook 登入**或**使用 Amazon 登入**。

1. 登入並同意與應用程式共用使用者資料。

1. 供應商重新導向回應用程式的重新導向 URI

1. 應用程式會將提供者字符傳送至您的身分集區，並擷取臨時 AWS 憑證

1. 應用程式會在 Web 介面中顯示**結果**面板。

   身分驗證成功後，您會看到顯示**結果**面板的 Web 界面，而且您有兩個選項可以探索它們：

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-12T13:36:17-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      +  應用程式使用社交 IdP 登入使用者，並取得提供者字符。身分集區接受來自社交提供者的這些成品：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/getting-started-identity-pools-application.html)

        與社交供應商成功進行身分驗證後，您的應用程式會收到 OAuth 回應，其中包含存取字符和其他身分驗證詳細資訊：

        ```
        {
           "access_token": "ya29.A0AS3H6NEXAMPLE......",
           "expires_in": 3599,
           "scope": "openid https://www.examplesocial....",
           "token_type": "Bearer",
           "id_token": "eyJhbGciOiJSUzI1NiIsEXAMPLE......"
        }
        ```
      +  `GetId()` 具有身分集區 ID 的 API 請求，以及包含社交供應商字符的`Logins`映射

        ```
        POST GetId
        {
          "IdentityPoolId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
          "Logins": {
            "accounts.google.com": "token..."
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```
      +  `GetOpenIdToken()` 與傳回的 `IdentityID`和相同的登入對應

        ```
        POST GetOpenIdToken
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Logins": {
            "accounts.google.com": "token..."
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Token": "eyJraWQiOiJFWAMPLE......"
        }
        ```
      +  `AssumeRoleWithWebIdentity()` 使用 OpenID 字符

        ```
        POST AssumeRoleWithWebIdentity
        {
          "RoleArn": "arn:aws:iam::111122223333:role/Cognito_IdentityPoolAuth_Role",
          "WebIdentityToken": "eyJraWQiOiJFWAMPLE......"
        }
        ```

        回應：

        ```
        {
          "Credentials": {
            "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
            "Expiration": "2025-08-12T14:36:17-07:00"
          }
        }
        ```

**發生的情況**：Amazon Cognito 會根據設定的提供者驗證權杖，並發出 OpenID 權杖。應用程式 AWS STS 直接呼叫 以擔任 IAM 角色並接收臨時登入資料。

------

### 了解社交存取
<a name="understand-social-access"></a>
+ 社交使用者驗證其社交提供者之後，會透過 Amazon Cognito 身分集區接收臨時 AWS 憑證。
+ 每個已驗證的使用者都會取得保留在工作階段間的唯一身分 ID。
+ 這些登入資料會連結至專為已驗證存取設計的 IAM 角色，提供比訪客存取更廣泛的許可。
+ 社交提供者字符會交換為 AWS 登入資料，以維護使用者身分和許可。

## Amazon Cognito 使用者集區身分驗證
<a name="user-pool-authentication"></a>

此步驟會探索 Amazon Cognito 身分驗證與使用者集區[受管登入](cognito-user-pools-managed-login.md)整合。當您將使用者集區做為 IdP 連結至身分集區時，使用者集區權杖會授權您的身分集區發出臨時登入資料。

------
#### [ User pool authentication with enhanced flow ]

增強型流程透過單一 API 請求，提供透過 Amazon Cognito 身分集區取得 AWS 憑證的簡化方法。

**搭配身分集區增強型流程使用 Amazon Cognito 使用者集區身分驗證**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**已驗證的存取**索引標籤。

1. 選擇**增強型流程**索引標籤。

1. 選擇**使用 Amazon Cognito 使用者集區登入**

1. 在受管登入中使用您的使用者名稱和密碼完成登入。

1. 使用者集區會使用授權碼重新導向回您的應用程式重新導向 URI。

1. 應用程式會與您的使用者集區交換授權碼，以取得 JSON Web 字符。

1. 應用程式會將 ID 字符與您的身分集區交換為臨時 AWS 登入資料

1. 應用程式會在 Web 介面中顯示**結果**面板

   身分驗證成功後，您會看到顯示**結果**面板的 Web 界面，而且您有兩個選項可以探索它們：

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-12T13:36:17-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      +  應用程式使用 Amazon Cognito 登入使用者。使用使用者集區成功驗證後，您的應用程式會收到包含 ID 字符 (JWT) 的 OAuth 2.0 回應。身分集區會使用此提供者金鑰格式接受來自使用者集區的 JWT ID 字符：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/getting-started-identity-pools-application.html)

        使用使用者集區成功驗證後，您的應用程式會收到包含 ID 字符 (JWT) 的 OAuth 2.0 回應：

        ```
        {
           "id_token": "eyJraWQiOiJFWAMPLE......",
           "token_type": "Bearer",
           "expires_in": 3600
        }
        ```
      +  `GetId()` 具有 `identityPoolId`和`Logins`映射的 API 請求，其中包含映射至 的使用者集區提供者金鑰`id_token`。Amazon Cognito 已驗證使用者集區 ID 權杖的簽章、發行者、到期和對象 (`aud`) 符合您在身分集區中為此使用者集區 IdP 註冊的其中一個應用程式用戶端 IDs。

        ```
        POST GetId
        {
          "AccountId": "111122223333",
          "IdentityPoolId": "us-east-1:1ac4a76d-1fef-48aa-83af-4224799c0b5c",
          "Logins": {
            "cognito-idp.us-east-1.amazonaws.com/us-east-1_EXAMPLE123": "eyJraWQiOiJFWAMPLE......"
          }
        }
        ```

        如果有效，它會尋找或建立並傳回使用者的 `IdentityID`。範例回應如下所示：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```
      +  `GetCredentialsForIdentity()` 傳回的 `identityPoolId`和 a=與 相同的`Logins`映射`id_token`。Amazon Cognito 會重新驗證使用者集區 ID 字符的簽章、發行者、到期和對象 (`aud`)，與您為身分集區中此使用者集區 IdP 註冊的其中一個應用程式用戶端 IDs 相符。

        ```
        POST GetCredentialsForIdentity
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Logins": {
            "cognito-idp.us-east-1.amazonaws.com/us-east-1_EXAMPLE123": "eyJraWQiOiJFWAMPLE......"
          }
        }
        ```

        如果有效，它會選擇 IAM 角色 (roles-in-token、規則或預設值）、代表您呼叫 AWS STS ，並傳回臨時 AWS 登入資料。範例回應如下所示：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Credentials": {
            "AccessKeyId": "ASIAW7TIP7EJEXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
            "Expiration": "2025-08-12T14:36:17-07:00"
          }
        }
        ```

------
#### [ User pool authentication with basic flow ]

基本流程提供對身分擷取和憑證產生之個別 API 請求的身分驗證程序的精細控制。

**搭配身分集區基本流程使用 Amazon Cognito 使用者集區身分驗證**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**已驗證的存取**索引標籤。

1. 選擇**基本流程**索引標籤。

1. 選擇**使用 Amazon Cognito 使用者集區登入**

1. 在受管登入中使用您的使用者名稱和密碼完成登入。

1. 使用者集區會使用授權碼重新導向回您的應用程式重新導向 URI。

1. 應用程式會與您的使用者集區交換授權碼，以取得 JSON Web 字符。

1. 應用程式會將 ID 字符與您的身分集區交換為臨時 AWS 登入資料

1. 應用程式會在 Web 介面中顯示**結果**面板

   身分驗證成功後，您將看到顯示**結果**面板的 Web 界面，並且您有兩個選項可以探索它們：

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-12T13:36:17-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      + 應用程式會使用 Amazon Cognito 使用者集區登入使用者，並取得 ID 字符 (JWT) 做為成品。使用使用者集區成功驗證後，您的應用程式會收到包含 ID 字符 (JWT) 的 OAuth 回應。身分集區使用此字符進行身分驗證：

        ```
        {
           "id_token": "eyJraWQiOiJFWAMPLE......",
           "token_type": "Bearer",
           "expires_in": 3600
        }
        ```
      + `GetId()` 具有身分集區 ID 和`Logins`映射的 API 請求，其中包含您的使用者集區提供者金鑰和 ID 字符作為值。Amazon Cognito 已驗證使用者集區 ID 權杖的簽章、到期和對象 (aud) 符合您在身分集區中為此使用者集區 IdP 註冊的其中一個應用程式用戶端 IDs。

        ```
        POST GetId
        {
          "AccountId": "111122223333",
          "IdentityPoolId": "us-east-1:1ac4a76d-1fef-48aa-83af-4224799c0b5c",
          "Logins": {
            "cognito-idp.us-east-1.amazonaws.com/us-east-1_EXAMPLE123": "eyJraWQiOiJFWAMPLE......"
          }
        }
        ```

        如果有效，它會尋找或建立並傳回使用者的 `IdentityID`。範例回應如下所示：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```
      + `GetOpenIdToken()` 與傳回的 `IdentityID`和相同的`Logins`映射

        ```
        POST GetOpenIdToken
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Logins": {
            "cognito-idp.us-east-1.amazonaws.com/us-east-1_EXAMPLE123": "eyJraWQiOiJFWAMPLE......"
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Token": "eyJraWQiOiJFWAMPLE......"
        }
        ```

        **此步驟中發生的情況：**Amazon Cognito 會從 cognito-identity.amazonaws.com 發出代表此 的短期 OpenID Connect Web 身分字符`IdentityId`。字符包含 AWS STS 評估的 OIDC 宣告，包括 aud （您的身分集區 ID) 和 amr （已驗證或未驗證）。IAM 角色的信任政策必須要求這些宣告。
      + `AssumeRoleWithWebIdentity()` - 您的應用程式 AWS STS 會直接呼叫 ，以交換 Amazon Cognito OpenID 字符做為臨時 AWS 登入資料

        ```
        POST sts:AssumeRoleWithWebIdentity
        {
          "RoleArn": "arn:aws:iam::111122223333:role/Cognito_IdentityPoolAuth_Role",
          "WebIdentityToken": "eyJraWQiOiJFWAMPLE......",
          "RoleSessionName": "CognitoIdentityCredentials"
        }
        ```

        回應：

        ```
        {
          "Credentials": {
            "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "FwoGZXIvYXdzEEXAMPLE......",
            "Expiration": "2025-08-12T14:36:17-07:00"
          },
          "AssumedRoleUser": {
            "AssumedRoleId": "AROAW7TIP7EJYEXAMPLE:CognitoIdentityCredentials",
            "Arn": "arn:aws:sts::111122223333:assumed-role/Cognito_IdentityPoolAuth_Role/CognitoIdentityCredentials"
          }
        }
        ```

        **您的示範應用程式執行的動作：**您的應用程式將 OpenID 權杖從 `GetOpenIdToken()`傳送到 AWS STS，請求臨時登入資料。 AWS STS 已執行驗證檢查和發行的登入資料：

------

### 了解使用者集區存取
<a name="understand-user-pool-access"></a>
+ 使用者集區使用者會透過 Amazon Cognito 身分集區接收臨時 AWS 登入資料。
+ 這些登入資料會連結到身分集區組態中指定的 IAM 角色。
+ 使用者集區 ID 字符會透過身分集區交換 AWS 登入資料。

## SAML 身分驗證
<a name="saml-authentication"></a>

此步驟會探索 SAML 身分驗證。使用者可以使用支援 SAML 存取 AWS 服務的企業身分提供者登入。範例應用程式不支援使用 SAML 的基本流程。

------
#### [ SAML authentication with enhanced flow ]

本節說明如何使用 SAML 身分提供者登入使用者，並使用增強型流程，將 Amazon Cognito 身分集區中的 SAML 聲明交換為臨時 AWS 憑證以呼叫 AWS 服務。

**搭配身分集區增強流程使用 SAML 身分驗證**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**已驗證存取**索引標籤。

1. 選擇**增強型流程**索引標籤。

1. 選擇**使用 SAML 供應商登入**

1. 使用您的企業登入資料完成登入。

1. 使用者集區會使用 SAML 聲明重新導向回您的應用程式重新導向 URI。

1. 應用程式會與您的使用者集區交換授權碼，以取得 JSON Web 字符。

1. 應用程式會將 SAML 回應與您的身分集區交換為臨時 AWS 登入資料

1. 應用程式會在 Web 介面中顯示**結果**面板

   身分驗證成功後，您會看到顯示**結果**面板的 Web 界面，而且您有兩個選項可以探索它們：

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-12T13:36:17-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      +  應用程式會使用 SAML IdP 登入使用者，並取得 SAML 回應。身分集區使用 SAML 提供者 ARN 做為金鑰，接受來自企業提供者的 SAML 聲明：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/getting-started-identity-pools-application.html)

        與 SAML 供應商成功進行身分驗證後，您的應用程式會透過 HTTP POST 接收 SAML 回應到您的回呼 URL：

        ```
        {
          "saml_response": "PD94bWwgdmVyc2lvbj0iMS4wIiBFWAMPLE...",
          "provider_arn": "arn:aws:iam::111122223333:saml-provider/EXAMPLE",
          "status": "Authentication successful"
        }
        ```
      +  `GetId()` 具有身分集區 ID 的 API 請求，以及包含 SAML 供應商 ARN 和聲明的`Logins`映射

        ```
        POST GetId
        {
          "AccountId": "111122223333",
          "IdentityPoolId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
          "Logins": {
            "arn:aws:iam::111122223333:saml-provider/EXAMPLE": "PD94bWwgdmVyc2lvbj0iMS4wIiBFWAMPLE..."
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```
      +  `GetCredentialsForIdentity()` 與傳回的 `IdentityID`和相同的`Logins`映射

        ```
        POST GetCredentialsForIdentity
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Logins": {
            "arn:aws:iam::111122223333:saml-provider/EXAMPLE": "PD94bWwgdmVyc2lvbj0iMS4wIiBFWAMPLE..."
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Credentials": {
            "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......"
          }
        }
        ```

**發生的情況**：Amazon Cognito 會根據設定的提供者驗證 SAML 聲明、根據 SAML 屬性或規則選擇 IAM 角色，以及 AWS STS 代表您呼叫 。

------

### 了解 SAML 存取
<a name="understand-saml-access"></a>
+ 在向 SAML 供應商驗證之後，企業使用者會收到來自 Amazon Cognito 身分集區的臨時 AWS 憑證。
+ 每個已驗證的使用者都會取得保留在工作階段間的唯一身分 ID。
+ 這些登入資料會連結至專為已驗證存取設計的 IAM 角色，提供比訪客存取更廣泛的許可。
+ SAML 聲明會交換為 AWS 登入資料，以維護使用者身分和企業屬性。

## OpenID Connect (OIDC) 身分驗證
<a name="oidc-authentication"></a>

此步驟會探索企業身分提供者的 OIDC 身分驗證。使用者可以透過組織的企業身分提供者 （例如 Azure AD、Okta 或 Google Workspace) 登入以存取 AWS 服務。如果您要尋找將標準型身分驗證與 AWS 資源整合的相關資訊，請繼續閱讀。實作 OIDC 身分驗證後，您將了解如何利用 OIDC 宣告進行精細存取控制。

------
#### [ OIDC authentication with enhanced flow ]

本節說明如何使用 OIDC 身分提供者來登入使用者，並使用增強型流程，在 Amazon Cognito 身分集區中交換 OIDC 權杖，以取得臨時 AWS 憑證以呼叫 AWS 服務。

**搭配身分集區增強流程使用 OIDC 登入**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**已驗證存取**索引標籤。

1. 選擇**增強型流程**索引標籤。

1. 選擇**使用 OIDC 供應商登入**

1. 使用您的企業登入資料完成登入。

1. OIDC 提供者會使用授權碼重新導向回應用程式

1. 應用程式會與您的使用者集區交換授權碼，以取得 JSON Web 字符。

1. 應用程式會將 OIDC 權杖傳送至您的身分集區，並擷取臨時 AWS 憑證。

1. 應用程式會在 Web 介面中顯示**結果**面板

   身分驗證成功後，您將看到顯示**結果**面板的 Web 界面，並且您有兩個選項可以探索它們：

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-12T13:36:17-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      +  應用程式會使用 OIDC IdP 登入使用者，並取得 ID 字符。身分集區接受來自企業供應商的 OIDC 權杖：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/getting-started-identity-pools-application.html)

        與 OIDC 提供者成功進行身分驗證後，您的應用程式會收到包含字符的 OAuth 2.0 回應：

        ```
        {
          "token_type": "Bearer",
          "expires_in": 3600,
          "access_token": "eyJraWQiOiJFWAMPLE......",
          "scope": "email openid profile",
          "id_token": "eyJraWQiOiJFWAMPLE......"
        }
        ```
      +  `GetId()` 具有身分集區 ID 的 API 請求，以及包含 OIDC 提供者字符的`Logins`映射

        ```
        POST GetId
        {
          "AccountId": "111122223333",
          "IdentityPoolId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
          "Logins": {
            "example-provider.com/oauth2/default": "eyJraWQiOiJFWAMPLE......"
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```
      +  `GetCredentialsForIdentity()` 與傳回的 `IdentityID`和相同的登入對應

        ```
        POST GetCredentialsForIdentity
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Logins": {
            "example-provider.com/oauth2/default": "eyJraWQiOiJFWAMPLE......"
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Credentials": {
            "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......"
          }
        }
        ```

**發生的情況**：Amazon Cognito 會根據設定的提供者驗證 OIDC 權杖、選擇 IAM 角色 （預設、宣告型或規則映射），並 AWS STS 代表您呼叫 。

------
#### [ OIDC authentication with basic flow ]

本節說明如何使用 OIDC 身分提供者來登入使用者，並使用基本流程，在 Amazon Cognito 身分集區中交換 OIDC 權杖以呼叫 AWS AWS 服務。

**將 OIDC 登入與身分集區基本流程搭配使用**

1. 在示範應用程式中，導覽至**互動式示範**區段

1. 選擇**已驗證存取**索引標籤。

1. 選擇**基本流程**索引標籤。

1. 選擇**使用 OIDC 供應商登入**

1. 使用您的企業登入資料完成登入。

1. OIDC 提供者會使用授權碼重新導向回應用程式

1. 應用程式會與您的使用者集區交換授權碼，以取得 JSON Web 字符。

1. 應用程式會將 OIDC 權杖傳送至您的身分集區，並擷取臨時 AWS 憑證。

1. 應用程式會在 Web 介面中顯示**結果**面板

   身分驗證成功後，您將看到顯示**結果**面板的 Web 界面，並且您有兩個選項可以探索它們：

   1. **僅檢視登入**資料按鈕：如果您想要直接查看在沒有 API 流程詳細資訊的情況下產生的臨時 AWS 登入資料，請選擇此按鈕。

      ```
      {
        "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
        "Credentials": {
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "SessionToken": "IQoJb3JpZ2luX2VjEEXAMPLE......",
          "Expiration": "2025-08-12T13:36:17-07:00"
        }
      }
      ```

   1. **檢視詳細的 API 流程**按鈕：如果您想要查看step-by-step請求，請選擇此按鈕。
      +  應用程式會使用 OIDC IdP 登入使用者，並取得 ID 字符。身分集區接受來自企業供應商的 OIDC 權杖：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/getting-started-identity-pools-application.html)

        與 OIDC 提供者成功進行身分驗證後，您的應用程式會收到包含字符的 OAuth 2.0 回應：

        ```
        {
          "token_type": "Bearer",
          "expires_in": 3600,
          "access_token": "eyJraWQiOiJFWAMPLE......",
          "scope": "openid email profile",
          "id_token": "eyJraWQiOiJFWAMPLE......"
        }
        ```
      +  `GetId()` 具有身分集區 ID 的 API 請求，以及包含 OIDC 提供者字符的`Logins`映射

        ```
        POST GetId
        {
          "IdentityPoolId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
          "Logins": {
            "example-provider.com/oauth2/default": "eyJraWQiOiJFWAMPLE......"
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222"
        }
        ```
      +  `GetOpenIdToken()` 傳回的 IdentityID 和相同的`Logins`映射

        ```
        POST GetOpenIdToken
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Logins": {
            "example-provider.com/oauth2/default": "eyJraWQiOiJFWAMPLE......"
          }
        }
        ```

        回應：

        ```
        {
          "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
          "Token": "eyJraWQiOiJFWAMPLE......"
        }
        ```
      +  `AssumeRoleWithWebIdentity()` 使用 OpenID 字符

        ```
        POST AssumeRoleWithWebIdentity
        {
          "RoleArn": "arn:aws:iam::111122223333:role/Cognito_IdentityPoolAuth_Role",
          "WebIdentityToken": "eyJraWQiOiJFWAMPLE......"
        }
        ```

        回應：

        ```
        {
          "Credentials": {
            "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
            "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
            "SessionToken": "FwoGZXIvYXdzEEXAMPLE......",
            "Expiration": "2025-08-12T14:36:17-07:00"
          }
        }
        ```

**發生的情況**：Amazon Cognito 會根據設定的提供者驗證 OIDC 權杖，並傳回 OpenID 權杖。應用程式 AWS STS 直接呼叫 以擔任適當的 IAM 角色，並收到短期登入資料。

------

### 了解 OIDC 身分驗證
<a name="understand-oidc-authentication"></a>
+ 標準型：OIDC 是以 OAuth 2.0 為基礎，並提供標準化的身分資訊。
+ 權杖驗證：可以驗證 ID 權杖的真實性。
+ 以宣告為基礎的存取：OIDC 宣告可用於角色映射和存取控制。
+ 企業整合：與熱門的企業身分提供者搭配使用。

## 後續步驟
<a name="next-steps"></a>

現在您已設定並探索示範應用程式，您可以：
+ 設定您尚未測試的其他身分提供者
+ 使用增強型和基本身分驗證進行實驗，以了解其差異
+ 針對您自己的使用案例自訂示範
+ 將 Amazon Cognito 身分集區整合到您自己的應用程式中。