身份池的示例应用程序 - Amazon Cognito

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

身份池的示例应用程序

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

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

从以下地址下载示例应用程序 GitHub

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

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

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

实施访客(未经验证)访问
  • 无需登录即可提供有限的 AWS 服务 访问权限

与支持的身份提供者集成
  • 社交平台 IdPs (Facebook、亚马逊、Twitter、苹果和谷歌)供消费者访问

  • 面向企业 IdPs 用户的企业版(通过 OpenID Connect 或 SAML)

  • Amazon Cognito 用户群体

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

  • 使用临时证书安全访问 AWS 服务

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

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

先决条件

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

  • 有权访问亚马逊 Cognito 的 AWS 账户。如果您没有 AWS 帐户,请按照中的说明进行操作入门 AWS

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

  • GitHub 访问。

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

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

身份验证提供商设置

要使用此应用程序获得最佳效果,请设置一个或多个第三方身份提供商 (IdPs) 或 Amazon Cognito 用户池并将其与您的 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 身份池演示应用程序完成基本和增强型身份验证流程。通过此演示,您将了解身份池如何与各种身份提供商合作,为您的应用程序用户提供临时 AWS 证书。

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

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

向尚未进行身份验证的用户提供 AWS 凭证。

经过身份验证的访问

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

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

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

重要

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

Guest access with enhanced flow

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

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

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

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

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

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

  6. 在成功进行身份验证后,您将看到 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看 step-by-step 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 验证访客访问权限,在内部扮演未经身份验证的角色 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. 在演示应用程序中,导航到交互式演示部分

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

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

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

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

  6. 在成功进行身份验证后,您将看到 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" } }
    2. 查看详细的 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 身份令牌。该令牌包括 AWS STS 可评估的 OIDC 声明,包括 aud(您的身份池 ID)和 amr(经过身份验证或未经身份验证)。您的 IAM 角色的信任策略必须要求具有这些声明。

      • AssumeRoleWithWebIdentity()-您的应用程序 AWS STS 直接调用以使用亚马逊 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 凭证

使用临时凭证

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

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

以下示例配置凭证提供者为访客用户提供有限的 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 身份池配合使用的整体流程。社交身份验证可提供熟悉的登录体验,同时又能通过联合身份管理维护安全性。您可以通过谷歌、Facebook 和亚马逊等社交身份提供商 (IdP) 登录,然后使用该 IdP 令牌兑换临时证书。 AWS 身份池也支持 Twitter 和 Apple 集成,但示例应用程序不支持。

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

Social identity provider with enhanced flow

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

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

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

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

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

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

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

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

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

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

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

        成功通过社交服务提供商进行身份验证后,您的应用会收到包含访问令牌和其他身份验证详细信息的 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 角色,然后 AWS STS 代表您调用。然后,您的身份池返回了临时凭证。

Social identity provider with basic flow

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

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

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

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

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

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

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

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

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

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

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

        成功通过社交服务提供商进行身份验证后,您的应用会收到包含访问令牌和其他身份验证详细信息的 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 令牌。应用程序 AWS STS 直接调用以担任 IAM 角色并接收临时证书。

了解社交访问

  • 社交用户在向社交提供者进行身份验证后,通过 Amazon Cognito 身份池获得临时 AWS 证书。

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

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

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

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

User pool authentication with enhanced flow

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

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

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

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

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

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

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

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

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

  9. 应用程序在 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" } }
    2. 查看详细的 API 流程按钮:如果您想查看 step-by-step 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) 与 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_tokenGetCredentialsForIdentity()。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、规则或默认角色), 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. 在演示应用程序中,导航到交互式演示部分

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

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

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

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

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

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

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

  9. 应用程序在 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" } }
    2. 查看详细的 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 身份令牌。该令牌包括 AWS STS 可评估的 OIDC 声明,包括 aud(您的身份池 ID)和 amr(经过身份验证或未经身份验证)。您的 IAM 角色的信任策略必须要求具有这些声明。

      • AssumeRoleWithWebIdentity()-您的应用程序 AWS STS 直接调用以使用亚马逊 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" } }

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

  • 用户池用户通过 Amazon Cognito 身份池获得临时 AWS 证书。

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

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

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

SAML authentication with enhanced flow

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

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

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

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

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

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

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

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

  8. 应用程序将 SAML 响应与您的身份池交换,以获取临时证书 AWS

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

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

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

        成功通过 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 角色,然后代表您调用。 AWS STS

了解 SAML 访问

  • 企业用户在向 SAML 提供商进行身份验证后,会收到来自 Amazon Cognito 身份池的临时 AWS 证书。

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

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

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

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

OIDC authentication with enhanced flow

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

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

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

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

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

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

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

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

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

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

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

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

        成功通过 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 角色(默认、基于声明或规则映射)并代表您调用。 AWS STS

OIDC authentication with basic flow

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

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

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

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

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

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

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

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

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

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

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

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

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

了解 OIDC 身份验证

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

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

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

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

后续步骤

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

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

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

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

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