

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

# 身份池的示例应用程序
<a name="getting-started-identity-pools-application"></a>

Amazon Cognito 身份池最常见的用例是联合来自多个登录系统的用户，并直接向客户端提供临时的、受限访问 Amazon 的证书。这样就无需为访问您的 Amazon 资源而构建凭证代理。例如，您可能需要允许用户使用其社交媒体账户登录，以及从 Amazon S3 访问您的移动应用程序的应用程序资产。身份池还向使用用户池登录的用户提供凭证。

在本教程中，您将创建一个 Web 应用程序，通过身份池中支持的身份提供商 (IdPs)，可以在增强版和基本[身份验证流程](authentication-flow.md)中获取经过身份验证的临时凭证和访客凭证。如果您已经有过 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 请求细分的基本身份验证流程

**实施访客（未经验证）访问**  
+ 无需登录即可提供有限的 Amazon Web Services 服务 访问权限

**与支持的身份提供者集成**  
+ 社交平台 IdPs （Facebook、亚马逊、Twitter、苹果和谷歌）供消费者访问
+ 面向企业 IdPs 用户的企业版（通过 OpenID Connect 或 SAML）
+ Amazon Cognito 用户群体

**Amazon 凭证管理**  
+ 将身份提供者令牌交换为临时 Amazon 凭证
+ 使用临时证书安全访问 Amazon 服务

在开发 Web 服务器上设置应用程序并在浏览器中访问该应用程序后，您会看到以下选项。

![\[Amazon Cognito 身份池演示应用程序 Web 界面屏幕截图，显示包含身份验证方法选项和交互式演示部分的主页。\]](http://docs.amazonaws.cn/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>

在开始之前，您需要配置以下资源。
+ 有权访问亚马逊 Cognito 的 Amazon 账户。如果您没有 Amazon 帐户，请按照中的说明进行操作[入门 Amazon](cognito-getting-started-account-iam.md)。
+ 在开发计算机上安装的 Python 3.8 或更高版本。
+ GitHub 访问。
+ Amazon 凭证配置了向 Amazon Cognito APIs 发出经过身份验证的请求的权限。[开发人员身份验证](authentication-flow.md#authentication-flow-developer)需要用到这些凭证。

有关在您的特定 SDK 中实现 Amazon 凭证和身份池联合的更多信息，请参阅[获取凭证](getting-credentials.md)。

## 身份验证提供商设置
<a name="demo-authentication-provider-setup"></a>

要使用此应用程序获得最佳效果，请设置一个或多个第三方身份提供商 (IdPs) 或 Amazon Cognito 用户池并将其与您的 Amazon Cognito 身份池集成到您的 Amazon Cognito 身份池中。在完成先决条件后和运行此演示应用程序前，请选择要配置的身份提供者。[Amazon Cognito 控制台](https://console.amazonaws.cn/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.amazonaws.cn/cognito/home)。

1. 从左侧导航菜单中，选择**身份池**。选择现有身份池或者创建新身份池。

1. 在**用户访问权限**下，启用**经过身份验证的访问权限**和**访客访问权限**。配置新的或现有的 [IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-idp.html)，并为其分配您要向每种类型的用户授予的[权限](https://docs.amazonaws.cn/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. 通过复制[示例环境文件](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/python/example_code/cognito/scenarios/identity_pools_example_demo/web/.env.example)来创建 `.env` 文件。

   ```
   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 身份池演示应用程序完成基本和增强型身份验证流程。通过此演示，您将了解身份池如何与各种身份提供商合作，为您的应用程序用户提供临时 Amazon 证书。

在示例应用程序的**交互式演示**部分，您将首先在身份池支持的两种访问类型之间进行选择。

**[未经身份验证的（访客）访问](#unauthenticated-access)**  
向尚未进行身份验证的用户提供 Amazon 凭证。

**经过身份验证的访问**  
使用身份提供者令牌交换具有全部可用权限的 Amazon 证书。从您在 `.env` 文件中配置的身份提供者中选择一个身份提供者。

## 未经身份验证的（访客）访问
<a name="unauthenticated-access"></a>

此步骤演示如何通过身份池的访客访问功能为未经身份验证的（访客）用户获取临时 Amazon 证书。在演示应用程序中，您将测试增强型和基本流程，以了解身份池如何在不要求用户登录的情况下颁发凭证。访客访问使用与经过身份验证的访问相同的 API 序列，但不提供身份提供商令牌（例如来自 Google、Facebook 的 OAuth 令牌或来自企业提供商的 SAML 断言）。

如果您找的是有关在不要求身份验证的情况下向用户提供有限 Amazon 访问权限的信息，请继续阅读。实现访客访问后，您将学习如何安全地向匿名用户提供 Amazon 凭证，并了解两种身份验证流程之间的区别。

**重要**  
未经身份验证的访问可以向任何具有互联网访问权限的人颁发证书，因此它最适合用于需要最低安全性的 Amazon 资源，例如公共资源 APIs 和图形资产。在继续执行此步骤之前，请检查您是否已将身份池配置为启用访客访问权限，并确保已制定适当的 IAM 策略来限制权限。

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

增强型流程是一种简化的方法，可通过两个 API 请求为未经身份验证的用户获取 Amazon 凭证。

**使用增强型流程测试访客访问**

1. 在演示应用程序中，导航到**交互式演示**部分

1. 选择**访客访问权限**选项卡。

1. 选择**增强型流程**选项卡。

1. 选择**测试访客访问权限**。

1. 该应用程序无需其他身份验证提示即可从您的身份池中获取临时 Amazon 证书。

1. 在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项：

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      + 带 `identityPoolId` 的 `GetId()` API 请求。访客访问无需身份验证令牌

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

        如果有效，它将查找或创建并返回用户的 `IdentityID`。示例响应如下：

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

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

        Cognito 验证访客访问权限，在内部扮演未经身份验证的角色 Amazon 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. 该应用程序无需其他身份验证提示即可从您的身份池中获取临时 Amazon 证书。

1. 在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项。

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      +  带身份池 ID 的 `GetId()` API 请求。访客访问无需身份验证令牌。

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

        如果有效，它将查找或创建并返回用户的 `IdentityID`。示例响应如下：

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

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

        响应：

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

        **此步骤中会发生什么：**Amazon Cognito 从代表此 `IdentityId` 的 cognito-identity.amazonaws.com 发布一个短期 OpenID Connect Web 身份令牌。该令牌包括 Amazon STS 可评估的 OIDC 声明，包括 aud（您的身份池 ID）和 amr（经过身份验证或未经身份验证）。您的 IAM 角色的信任策略必须要求具有这些声明。
      +  `AssumeRoleWithWebIdentity()`-您的应用程序 Amazon STS 直接调用以使用亚马逊 Cognito OpenID 令牌兑换临时证书 Amazon 

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

        响应：

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

        **此步骤中会发生什么：**经过验证后：返回临时 Amazon 凭证

------

### 使用临时凭证
<a name="use-temporary-credentials"></a>

这些临时证书用作标准 Amazon 证书，但权限有限，由您的身份池未经身份验证的 IAM 角色定义。您可以将它们与任何 Amazon SDK 一起使用，或者 Amazon CLI。有关 Amazon SDKs 使用凭据进行配置的更多信息，请参阅《工具参考指南》 Amazon SDKs 和《工具参考指南》中的[标准化凭据提供程序](https://docs.amazonaws.cn/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 身份池配合使用的整体流程。社交身份验证可提供熟悉的登录体验，同时又能通过联合身份管理维护安全性。您可以通过谷歌、Facebook 和亚马逊等社交身份提供商 (IdP) 登录，然后使用该 IdP 令牌兑换临时证书。 Amazon 身份池也支持 Twitter 和 Apple 集成，但示例应用程序不支持。

身份池本身不是用户目录。它不存储密码或配置文件字段。相反，它信任外部 IdPs 来对用户进行身份验证，并专注于通过出售 IAM 角色的证书来授权该已通过身份验证的用户直接调用 Amazon 服务。

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

本节介绍如何使用社交身份提供者让用户登录，以及如何使用增强型流程，将 Amazon Cognito 身份池中的提供商令牌交换为临时凭证来请求 Amazon 资源。

**通过示例应用程序中的增强型流程使用社交登录**

1. 在演示应用程序中，导航到**交互式演示**部分

1. 选择**经过身份验证的访问权限**选项卡。

1. 选择**增强型流程**选项卡。

1. 选择您配置的受支持社交提供商，例如 **Sign in with Google**、**Sign in with Facebook** 或 ** Login with Amazon**。

1. 登录并同意与应用程序共享用户数据。

1. 提供商重定向回应用程序的重定向 URI

1. 该应用程序将提供商令牌发送到您的身份池并检索临时证书 Amazon 

1. 应用程序在 Web 界面中显示**结果**面板。

   在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项：

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      +  应用程序使用社交 IdP 让用户登录并获取提供商令牌。身份池接受来自社交提供商的以下构件：    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/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......"
        }
        ```
      +  带身份池 ID 和包含您的社交提供商令牌的 `Logins` 映射的 `GetId()` API 请求

        ```
        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"
        }
        ```
      + 带返回的 `IdentityID` 和相同 `Logins` 映射的 `GetCredentialsForIdentity()`

        ```
        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 角色，然后 Amazon STS 代表您调用。然后，您的身份池返回了临时凭证。

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

本节介绍如何使用社交身份提供者登录用户，以及如何使用基本流程将 Amazon Cognito 身份池中的提供者令牌交换为调用 Amazon 服务的临时证书。

**通过示例应用程序中的基本流程使用社交登录**

1. 在演示应用程序中，导航到**交互式演示**部分

1. 选择**经过身份验证的访问权限**选项卡。

1. 选择**基本流程**选项卡。

1. 选择您配置的受支持社交提供商，例如 **Sign in with Google**、**Sign in with Facebook** 或 ** Login with Amazon**。

1. 登录并同意与应用程序共享用户数据。

1. 提供商重定向回应用程序的重定向 URI

1. 该应用程序将提供商令牌发送到您的身份池并检索临时证书 Amazon 

1. 应用程序在 Web 界面中显示**结果**面板。

   在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项：

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      +  应用程序使用社交 IdP 让用户登录并获取提供商令牌。身份池接受来自社交提供商的以下构件：    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/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......"
        }
        ```
      +  带身份池 ID 和包含您的社交提供商令牌的 `Logins` 映射的 `GetId()` API 请求

        ```
        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"
        }
        ```
      +  带返回的 `IdentityID` 和相同 Logins 映射的 `GetOpenIdToken()`

        ```
        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......"
        }
        ```
      +  带 OpenID 令牌的 `AssumeRoleWithWebIdentity()`

        ```
        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 令牌。应用程序 Amazon STS 直接调用以担任 IAM 角色并接收临时证书。

------

### 了解社交访问
<a name="understand-social-access"></a>
+ 社交用户在向社交提供者进行身份验证后，通过 Amazon Cognito 身份池获得临时 Amazon 证书。
+ 每个经过身份验证的用户都将获得一个在各个会话中一直保留的唯一身份 ID。
+ 这些凭证链接到专为经过身份验证的访问设计的 IAM 角色，从而提供比访客访问更广泛的权限。
+ 社交提供者令牌用于交换 Amazon 凭证，从而维护用户身份和权限。

## Amazon Cognito 用户池身份验证
<a name="user-pool-authentication"></a>

此步骤探讨通过用户池[托管登录](cognito-user-pools-managed-login.md)集成进行 Amazon Cognito 身份验证。当您将用户池作为 IdP 链接到身份池时，用户池令牌会授权您的身份池发布临时凭证。

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

增强型流程提供了一种通过 Amazon Cognito 身份池使用单个 API 请求获取 Amazon 凭证的简化方法。

**通过身份池增强型流程使用 Amazon Cognito 用户池身份验证**

1. 在演示应用程序中，导航到**交互式演示**部分

1. 选择**经过身份验证的访问权限**选项卡。

1. 选择**增强型流程**选项卡。

1. 选择**使用 Amazon Cognito 用户池登录**

1. 在托管登录中使用用户名和密码完成登录。

1. 用户池将使用授权码重定向回您的应用程序重定向 URI。

1. 应用程序将用户池的授权码交换为 JSON Web 令牌。

1. 应用程序将 ID 令牌与您的身份池交换，以获取临时 Amazon 证书

1. 应用程序在 Web 界面中显示**结果**面板。

   在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项：

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      +  应用程序使用 Amazon Cognito 让用户登录。成功使用用户池进行身份验证后，您的应用程序会收到包含 ID 令牌 (JWT) 的 OAuth 2.0 响应。身份池使用以下提供商密钥格式接受来自用户池的 JWT ID 令牌：    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/cognito/latest/developerguide/getting-started-identity-pools-application.html)

        成功使用用户池进行身份验证后，您的应用程序会收到包含 ID 令牌 (JWT) 的 OAuth 2.0 响应：

        ```
        {
           "id_token": "eyJraWQiOiJFWAMPLE......",
           "token_type": "Bearer",
           "expires_in": 3600
        }
        ```
      +  带 `identityPoolId` 和 `Logins` 映射（包括映射到 `id_token` 的用户池提供商密钥）的 `GetId()` API 请求。Amazon Cognito 已验证用户池 ID 令牌的签名、颁发者、到期时间和受众 (`aud`) 与 IDs 您在身份池中为该用户池 IdP 注册的应用程序客户端之一匹配。

        ```
        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"
        }
        ```
      +  带返回的 `identityPoolId` 以及相同的 `Logins` 映射与 `id_token` 的 `GetCredentialsForIdentity()`。Amazon Cognito 会重新验证用户池 ID 令牌的签名、颁发者、到期日以及受众 (`aud`) 与 IDs 您在身份池中为该用户池 IdP 注册的应用程序客户端。

        ```
        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、规则或默认角色）， Amazon STS 代表您调用并返回临时 Amazon 证书。示例响应如下：

        ```
        {
          "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 令牌与您的身份池交换，以获取临时 Amazon 证书

1. 应用程序在 Web 界面中显示**结果**面板。

   在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项：

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      + 应用程序使用 Amazon Cognito 用户池让用户登录，并获取身份令牌（JWT）作为构件。成功使用用户池进行身份验证后，您的应用程序会收到包含 ID 令牌 (JWT) 的 OAuth 响应。身份池使用此令牌进行身份验证：

        ```
        {
           "id_token": "eyJraWQiOiJFWAMPLE......",
           "token_type": "Bearer",
           "expires_in": 3600
        }
        ```
      + 带您的身份池 ID 和 `Logins` 映射（包括您的用户池提供商密钥和 ID 令牌作为值）的 `GetId()` API 请求。Amazon Cognito 已验证用户池 ID 令牌的签名、有效期和受众 (aud) 与 IDs 您在身份池中为该用户池 IdP 注册的其中一个应用程序客户端相匹配。

        ```
        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"
        }
        ```
      + 带返回的 `IdentityID` 和相同 `Logins` 映射的 `GetOpenIdToken()`

        ```
        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 从代表此 `IdentityId` 的 cognito-identity.amazonaws.com 发布一个短期 OpenID Connect Web 身份令牌。该令牌包括 Amazon STS 可评估的 OIDC 声明，包括 aud（您的身份池 ID）和 amr（经过身份验证或未经身份验证）。您的 IAM 角色的信任策略必须要求具有这些声明。
      + `AssumeRoleWithWebIdentity()`-您的应用程序 Amazon STS 直接调用以使用亚马逊 Cognito OpenID 令牌兑换临时证书 Amazon 

        ```
        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"
          }
        }
        ```

        **您的演示应用程序做了什么：**您的应用程序从 `GetOpenIdToken()` 向 Amazon STS发送了 OpenID 令牌，从而请求临时凭证。 Amazon STS 执行了验证检查并发布了凭证：

------

### 了解用户池访问
<a name="understand-user-pool-access"></a>
+ 用户池用户通过 Amazon Cognito 身份池获得临时 Amazon 证书。
+ 这些凭证链接到您的身份池配置中指定的 IAM 角色。
+ 用户池 ID 令牌通过身份池交换 Amazon 凭证。

## SAML 身份验证
<a name="saml-authentication"></a>

此步骤探讨 SAML 身份验证。用户可以使用支持 SAML 的企业身份提供商登录以访问 Amazon 服务。示例应用程序不支持基于 SAML 的基本流程。

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

本节介绍如何使用 SAML 身份提供商登录用户，以及如何使用增强的流程将 Amazon Cognito 身份池中的 SAML 断言交换为调用服务的临时 Amazon 证书。 Amazon 

**通过身份池增强型流程使用 SAML 身份验证**

1. 在演示应用程序中，导航到**交互式演示**部分

1. 选择**经过身份验证的访问权限**选项卡。

1. 选择**增强型流程**选项卡。

1. 选择**通过 SAML 提供商登录**。

1. 使用您的企业凭证完成登录。

1. 用户池使用 SAML 断言重定向回您的应用程序重定向 URI。

1. 应用程序将用户池的授权码交换为 JSON Web 令牌。

1. 应用程序将 SAML 响应与您的身份池交换，以获取临时证书 Amazon 

1. 应用程序在 Web 界面中显示**结果**面板。

   在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项：

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      +  应用程序使用 SAML IdP 让用户登录并获取 SAML 响应。身份池使用 SAML 提供商 ARN 作为密钥接受来自企业提供商的 SAML 断言：    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/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"
        }
        ```
      +  带身份池 ID 和包含您的 SAML 提供商 ARN 和断言的 `Logins` 映射的 `GetId()` API 请求

        ```
        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"
        }
        ```
      +  带返回的 `IdentityID` 和相同 `Logins` 映射的 `GetCredentialsForIdentity()`

        ```
        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 角色，然后代表您调用。 Amazon STS 

------

### 了解 SAML 访问
<a name="understand-saml-access"></a>
+ 企业用户在向 SAML 提供商进行身份验证后，会收到来自 Amazon Cognito 身份池的临时 Amazon 证书。
+ 每个经过身份验证的用户都将获得一个在各个会话中一直保留的唯一身份 ID。
+ 这些凭证链接到专为经过身份验证的访问设计的 IAM 角色，从而提供比访客访问更广泛的权限。
+ 使用 SAML 断言交换 Amazon 凭证，从而维护用户身份和企业属性。

## OpenID Connect（OIDC）身份验证
<a name="oidc-authentication"></a>

此步骤探讨使用企业身份提供者进行 OIDC 身份验证。用户可以通过其组织的企业身份提供商（例如 Azure AD、Okta 或 Google Workspace）登录以访问 Amazon 服务。如果您要找的是有关将基于标准的身份验证与您的 Amazon 资源集成的信息，请继续阅读。实施 OIDC 身份验证后，您将了解如何利用 OIDC 声明进行精细的访问控制。

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

本节介绍如何使用 OIDC 身份提供商登录用户，以及如何使用增强的流程将 Amazon Cognito 身份池中的 OIDC 令牌交换为调用服务的临时证书。 Amazon Amazon 

**通过身份池增强型流程使用 OIDC 登录**

1. 在演示应用程序中，导航到**交互式演示**部分

1. 选择**经过身份验证的访问权限**选项卡。

1. 选择**增强型流程**选项卡。

1. 选择**通过 OIDC 提供商登录**。

1. 使用您的企业凭证完成登录。

1. OIDC 提供商使用授权码重定向回应用程序。

1. 应用程序将用户池的授权码交换为 JSON Web 令牌。

1. 应用程序将 OIDC 令牌发送到您的身份池并检索临时证书。 Amazon 

1. 应用程序在 Web 界面中显示**结果**面板。

   在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项：

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      +  应用程序使用 OIDC IdP 让用户登录并获取 ID 令牌。身份池接受来自企业提供商的 OIDC 令牌：    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/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......"
        }
        ```
      +  带身份池 ID 和包含您的 OIDC 提供商令牌的 `Logins` 映射的 `GetId()` API 请求

        ```
        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"
        }
        ```
      +  带返回的 `IdentityID` 和相同 Logins 映射的 `GetCredentialsForIdentity()`

        ```
        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 角色（默认、基于声明或规则映射）并代表您调用。 Amazon STS 

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

本节介绍如何使用 OIDC 身份提供商登录用户，以及如何使用基本流程将 Amazon Cognito 身份池中的 OIDC 令牌交换为调用服务的临时证书。 Amazon Amazon 

**通过身份池基本流程使用 OIDC 登录**

1. 在演示应用程序中，导航到**交互式演示**部分

1. 选择**经过身份验证的访问权限**选项卡。

1. 选择**基本流程**选项卡。

1. 选择**通过 OIDC 提供商登录**。

1. 使用您的企业凭证完成登录。

1. OIDC 提供商使用授权码重定向回应用程序。

1. 应用程序将用户池的授权码交换为 JSON Web 令牌。

1. 应用程序将 OIDC 令牌发送到您的身份池并检索临时证书。 Amazon 

1. 应用程序在 Web 界面中显示**结果**面板。

   在成功进行身份验证后，您将看到 Web 界面显示**结果**面板，并且您有两个浏览选项：

   1. “**仅查看凭证**” 按钮：如果您想直接查看生成的不包含 API 流程详细信息的临时 Amazon 证书，请选择此按钮。

      ```
      {
        "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 API 请求，请选择此按钮。
      +  应用程序使用 OIDC IdP 让用户登录并获取 ID 令牌。身份池接受来自企业提供商的 OIDC 令牌：    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/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......"
        }
        ```
      +  带身份池 ID 和包含您的 OIDC 提供商令牌的 `Logins` 映射的 `GetId()` API 请求

        ```
        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"
        }
        ```
      +  带返回的 IdentityID 和相同 `Logins` 映射的 `GetOpenIdToken()`

        ```
        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......"
        }
        ```
      +  带 OpenID 令牌的 `AssumeRoleWithWebIdentity()`

        ```
        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 令牌。该应用程序 Amazon STS 直接调用以担任相应的 IAM 角色并收到短期证书。

------

### 了解 OIDC 身份验证
<a name="understand-oidc-authentication"></a>
+ 基于标准：OIDC 基于 OAuth 2.0 构建，提供标准化的身份信息。
+ 令牌验证：可以验证 ID 令牌的真实性。
+ 基于声明的访问：可以使用 OIDC 声明进行角色映射和访问控制。
+ 企业集成：与流行的企业身份提供者配合使用。

## 后续步骤
<a name="next-steps"></a>

现在您已经设置并探索了演示应用程序，您可以：
+ 配置您尚未测试的其他身份提供者
+ 尝试使用增强型身份验证和基本身份验证，以了解它们的区别
+ 针对您自己的使用案例自定义演示
+ 将 Amazon Cognito 身份池集成到您自己的应用程序中。