身份池的示例应用程序 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

身份池的示例应用程序

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

在本教程中,您将创建一个 Web 应用程序,在该应用程序中,您可以使用身份池中支持的身份提供者(IdP)在增强版和基本身份验证流程中获取临时的经过身份验证的凭证和访客凭证。如果您已经有 Web 开发经验,请从 GitHub 下载示例应用程序。

从 GitHub 下载示例应用程序

此示例应用程序演示了 Amazon Cognito 身份池的以下功能:

身份池中的身份验证流程
  • 具有详细 API 请求细分的增强型身份验证流程

  • 具有详细 API 请求细分的基本身份验证流程

实施访客(未经验证)访问
  • 提供有限的 Amazon Web Services 服务访问权限,无需登录

与支持的身份提供者集成
  • 供使用者访问的社交 IdP(Facebook、Amazon、Twitter、Apple 和 Google)

  • 面向公司用户的企业 IdP(通过 OpenID Connect 或 SAML)

  • Amazon Cognito 用户池

Amazon 凭证管理
  • 将身份提供者令牌交换为临时 Amazon 凭证

  • 使用临时凭证安全地访问 Amazon 服务

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

Amazon Cognito 身份池演示应用程序 Web 界面屏幕截图,显示包含身份验证方法选项和交互式演示部分的主页。

先决条件

在开始之前,您需要配置以下资源。

  • 有权访问 Amazon Cognito 的 Amazon 账户。如果您没有 Amazon 账户,请按照 开始使用 Amazon中的说明操作。

  • 在开发计算机上安装的 Python 3.8 或更高版本。

  • GitHub 访问权限。

  • 配置了向 Amazon Cognito API 发出经过身份验证的请求的权限的 Amazon 凭证。开发人员身份验证需要用到这些凭证。

有关在您的特定 SDK 中实施 Amazon 凭证和身份池联合身份验证的更多信息,请参阅获取凭证

身份验证提供商设置

要使用此应用程序获得最佳效果,请设置一个或多个第三方身份提供者(IdP)或 Amazon Cognito 用户池并将其与您的 Amazon Cognito 身份池集成。在完成先决条件后和运行此演示应用程序前,请选择要配置的身份提供者。Amazon Cognito 控制台将引导您完成配置身份池和提供商的过程。

注意

对于此演示应用程序,您无需设置所有支持的身份提供者。您可以从与您的使用案例匹配的提供商作为起点。每个链接都提供了详细的配置说明。

部署演示应用程序

克隆存储库

  1. 打开终端窗口。

  2. 克隆 aws-doc-sdk-examples 存储库或以其他方式检索存储库中的此文件夹

    git clone https://github.com/awsdocs/aws-doc-sdk-examples.git
  3. 导航到项目目录。

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

创建身份池

要为您的应用程序创建 Amazon Cognito 身份池,请按照身份池控制台概述中的说明操作。

为演示应用程序配置身份池
  1. 打开 Amazon Cognito 控制台

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

  3. 用户访问权限下,启用经过身份验证的访问权限访客访问权限。配置新的或现有的 IAM 角色,并为其分配您要向每种类型的用户授予的权限

  4. 用户访问权限下,设置您要配置的所有身份提供者。

  5. 身份池属性下,启用基本(经典)身份验证

  6. 保持您的浏览器对身份池控制台的开启状态。您将使用应用程序设置中的身份池 ID 和其他配置信息。

配置和运行应用程序

以下步骤将指导您完成演示应用程序的初始设置。

配置演示应用程序
  1. aws-doc-sdk-examples 克隆版的 python/example_code/cognito/scenarios/identity_pools_example_demo/web 中打开命令行。

  2. 通过复制示例环境文件来创建 .env 文件。

    cp .env.example .env
  3. 在文本编辑器中打开 .env 文件。用您自己的配置值替换文件中的示例值。

  4. 安装后端依赖项。

    pip install -r requirements.txt
  5. 启动后端服务器:

    cd backend python oauth_server.py
  6. 打开新终端窗口,导航到项目目录并启动前端服务器:

    cd frontend python -m http.server 8001
  7. 打开浏览器访问应用程序,网址为 http://localhost:8001。您的浏览器将显示演示应用程序界面,可供您测试身份池身份验证。

探索身份池中的身份验证方法

本节将指导您使用 Amazon Cognito 身份池演示应用程序完成基本和增强型身份验证流程。通过此演示,您将了解身份池如何与各种身份提供者配合使用,为您的应用程序用户提供临时 Amazon 凭证。

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

未经身份验证的(访客)访问

向尚未经过身份验证的用户提供 Amazon 凭证。

经过身份验证的访问

将身份提供者令牌交换为具有全范围可用权限的 Amazon 凭证。从您在 .env 文件中配置的身份提供者中选择一个身份提供者。

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

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

重要

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

Guest access with enhanced flow

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

使用增强型流程测试访客访问
  1. 在演示应用程序中,导航到交互式演示部分

  2. 选择访客访问权限选项卡。

  3. 选择增强型流程选项卡。

  4. 选择测试访客访问权限

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

  6. 在成功进行身份验证后,您将看到 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 API 请求,请选择此按钮。

      • identityPoolIdGetId() API 请求。访客访问无需身份验证令牌

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

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

        { "IdentityId": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111" }
      • 带返回的 identityPoolIdGetCredentialsForIdentity()

        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. 在演示应用程序中,导航到交互式演示部分

  2. 选择访客访问权限选项卡。

  3. 选择基本流程选项卡。

  4. 选择测试访客访问权限

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

  6. 在成功进行身份验证后,您将看到 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 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 以将 Amazon 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 凭证

使用临时凭证

这些临时凭证用作标准 Amazon 凭证,但权限有限,由身份池的未经身份验证的 IAM 角色定义。您可以将其与任何 Amazon SDK 或 Amazon CLI 配合使用。有关使用凭证配置 Amazon SDK 的更多信息,请参阅《Amazon SDK 和工具参考指南》中的标准化凭证提供者

以下示例并不完整,但它们显示了身份池的访客功能可以改善用户体验的常见方法。

以下示例配置凭证提供者为访客用户提供有限的 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' }));

以下示例为访客用户使用对 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 }));

此步骤探讨将社交身份提供者与 Amazon Cognito 身份池配合使用的整体流程。社交身份验证可提供熟悉的登录体验,同时又能通过联合身份管理维护安全性。您可以从 Google、Facebook 和 Amazon 等社交身份提供者(IdP)登录,然后将该 IdP 令牌交换为临时 Amazon 凭证。身份池也支持 Twitter 和 Apple 集成,但示例应用程序不支持。

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

Social identity provider with enhanced flow

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

通过示例应用程序中的增强型流程使用社交登录
  1. 在演示应用程序中,导航到交互式演示部分

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

  3. 选择增强型流程选项卡。

  4. 选择您配置的受支持社交提供商,例如 Sign in with GoogleSign in with Facebook Login with Amazon

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

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

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

  8. 应用程序在 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 API 请求,请选择此按钮。

      • 应用程序使用社交 IdP 让用户登录并获取提供商令牌。身份池接受来自社交提供商的以下构件:

        身份提供者 Cognito 提供商密钥 用途
        Google accounts.google.com 来自 Google 登录的 OAuth 2.0 令牌
        Facebook graph.facebook.com 来自 Facebook 登录的访问令牌
        Amazon www.amazon.com 来自 Login with Amazon 的 OAuth 令牌

        成功通过社交提供商的身份验证后,您的应用程序会收到包含访问令牌和其他身份验证详细信息的 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. 在演示应用程序中,导航到交互式演示部分

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

  3. 选择基本流程选项卡。

  4. 选择您配置的受支持社交提供商,例如 Sign in with GoogleSign in with Facebook Login with Amazon

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

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

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

  8. 应用程序在 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 API 请求,请选择此按钮。

      • 应用程序使用社交 IdP 让用户登录并获取提供商令牌。身份池接受来自社交提供商的以下构件:

        身份提供者 Cognito 提供商密钥 用途
        Google accounts.google.com 来自 Google 登录的 OAuth 2.0 令牌
        Facebook graph.facebook.com 来自 Facebook 登录的访问令牌
        Amazon www.amazon.com 来自 Login with Amazon 的 OAuth 令牌

        成功通过社交提供商的身份验证后,您的应用程序会收到包含访问令牌和其他身份验证详细信息的 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 角色并接收临时凭证。

了解社交访问

  • 社交用户在向社交提供商进行身份验证后,通过 Amazon Cognito 身份池接收临时 Amazon 凭证。

  • 每个经过身份验证的用户都将获得一个在各个会话中一直保留的唯一身份 ID。

  • 这些凭证链接到专为经过身份验证的访问设计的 IAM 角色,从而提供比访客访问更广泛的权限。

  • 社交提供商令牌交换 Amazon 凭证,从而维护用户身份和权限。

此步骤探讨通过用户池托管登录集成进行 Amazon Cognito 身份验证。当您将用户池作为 IdP 链接到身份池时,用户池令牌会授权您的身份池发布临时凭证。

User pool authentication with enhanced flow

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

通过身份池增强型流程使用 Amazon Cognito 用户池身份验证
  1. 在演示应用程序中,导航到交互式演示部分

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

  3. 选择增强型流程选项卡。

  4. 选择使用 Amazon Cognito 用户池登录

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

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

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

  8. 应用程序通过身份池将 ID 令牌交换为临时 Amazon 凭证

  9. 应用程序在 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 API 请求,请选择此按钮。

      • 应用程序使用 Amazon Cognito 让用户登录。成功进行用户池身份验证后,您的应用程序会收到包含 ID 令牌(JWT)的 OAuth 2.0 响应。身份池使用以下提供商密钥格式接受来自用户池的 JWT ID 令牌:

        身份提供者 Cognito 提供商密钥 用途
        Amazon Cognito 用户池 cognito-idp.{region}.amazonaws.com/{user-pool-id} 来自 Amazon Cognito 用户池的 JWT ID 令牌

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

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

        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_tokenGetCredentialsForIdentity()。Amazon Cognito 重新验证用户池 ID 令牌的签名、发布者、到期时间和受众(aud)是否与您在身份池中为该用户池 IdP 注册的应用程序客户端 ID 之一相匹配。

        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 角色(令牌内角色、规则角色或默认角色),代表您调用 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. 在演示应用程序中,导航到交互式演示部分

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

  3. 选择基本流程选项卡。

  4. 选择使用 Amazon Cognito 用户池登录

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

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

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

  8. 应用程序通过身份池将 ID 令牌交换为临时 Amazon 凭证

  9. 应用程序在 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 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)是否与您在身份池中为该用户池 IdP 注册的应用程序客户端 ID 之一相匹配。

        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 以将 Amazon 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 执行了验证检查并发布了凭证:

  • 用户池用户通过 Amazon Cognito 身份池接收临时 Amazon 凭证。

  • 这些凭证链接到您的身份池配置中指定的 IAM 角色。

  • 用户池 ID 令牌通过身份池交换为 Amazon 凭证。

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

SAML authentication with enhanced flow

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

通过身份池增强型流程使用 SAML 身份验证
  1. 在演示应用程序中,导航到交互式演示部分

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

  3. 选择增强型流程选项卡。

  4. 选择通过 SAML 提供商登录

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

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

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

  8. 应用程序通过身份池将 SAML 响应交换为临时 Amazon 凭证。

  9. 应用程序在 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 API 请求,请选择此按钮。

      • 应用程序使用 SAML IdP 让用户登录并获取 SAML 响应。身份池使用 SAML 提供商 ARN 作为密钥接受来自企业提供商的 SAML 断言:

        身份提供者 Cognito 提供商密钥 用途
        SAML 提供商 arn:aws:iam::111122223333:saml-provider/EXAMPLE 来自企业 IdP 的 SAML 断言

        成功通过 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 访问

  • 企业用户在向 SAML 提供商进行身份验证后,从 Amazon Cognito 身份池接收临时 Amazon 凭证。

  • 每个经过身份验证的用户都将获得一个在各个会话中一直保留的唯一身份 ID。

  • 这些凭证链接到专为经过身份验证的访问设计的 IAM 角色,从而提供比访客访问更广泛的权限。

  • SAML 断言交换为 Amazon 凭证,从而维护用户身份和企业属性。

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

OIDC authentication with enhanced flow

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

通过身份池增强型流程使用 OIDC 登录
  1. 在演示应用程序中,导航到交互式演示部分

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

  3. 选择增强型流程选项卡。

  4. 选择通过 OIDC 提供商登录

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

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

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

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

  9. 应用程序在 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 API 请求,请选择此按钮。

      • 应用程序使用 OIDC IdP 让用户登录并获取 ID 令牌。身份池接受来自企业提供商的 OIDC 令牌:

        身份提供者 Cognito 提供商密钥 用途
        OIDC 提供商 example-provider.com/oauth2/default 来自企业 IdP 的 OIDC ID 令牌

        成功进行 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. 在演示应用程序中,导航到交互式演示部分

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

  3. 选择基本流程选项卡。

  4. 选择通过 OIDC 提供商登录

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

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

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

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

  9. 应用程序在 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看分步 API 请求,请选择此按钮。

      • 应用程序使用 OIDC IdP 让用户登录并获取 ID 令牌。身份池接受来自企业提供商的 OIDC 令牌:

        身份提供者 Cognito 提供商密钥 用途
        OIDC 提供商 example-provider.com/oauth2/default 来自企业 IdP 的 OIDC ID 令牌

        成功进行 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 身份验证

  • 基于标准:OIDC 基于 OAuth 2.0 构建,并提供标准化的身份信息。

  • 令牌验证:可以验证 ID 令牌的真实性。

  • 基于声明的访问:可以使用 OIDC 声明进行角色映射和访问控制。

  • 企业集成:与流行的企业身份提供者配合使用。

后续步骤

现在您已经设置并探索了演示应用程序,您可以:

  • 配置您尚未测试的其他身份提供者

  • 尝试使用增强型身份验证和基本身份验证,以了解它们的区别

  • 针对您自己的使用案例自定义演示

  • 将 Amazon Cognito 身份池集成到您自己的应用程序中。