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

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

身份池的示例应用程序

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

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

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

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

身份池中的身份验证流程
  • 通过详细的 API 请求细分增强身份验证流程

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

实现访客(未经身份验证)访问权限
  • 无需登录即可提供有限的 Amazon Web Services 服务 访问权限

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

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

  • Amazon Cognito 用户群体

Amazon 凭证管理
  • 使用身份提供商令牌兑换临时 Amazon 证书

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

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

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

先决条件

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

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

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

  • GitHub 访问。

  • Amazon 凭证配置了向 Amazon Cognito APIs 发出经过身份验证的请求的权限。这些凭证是开发者身份验证所必需的。

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

身份验证提供商设置

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

注意

对于此演示应用程序,您无需设置所有支持的身份提供商。你可以从一个与你的用例相匹配的开始。每个链接都提供了详细的配置说明。

部署演示应用程序

克隆存储库

  1. 打开终端窗口。

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

    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 证书。

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

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

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

经过身份验证的访问权限

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

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

如果您正在寻找有关无需身份验证即可向用户提供有限 Amazon 访问权限的信息,请继续阅读。实现访客访问后,您将学习如何安全地向匿名用户提供 Amazon 凭证,并了解两种身份验证流程之间的区别。

重要

未经身份验证的访问可以向任何具有互联网访问权限的人颁发证书,因此它最适合用于需要最低安全性的 Amazon 资源,例如公共资源 APIs 和图形资产。在继续执行此步骤之前,请检查您是否已将身份池配置为启用访客访问权限,并确保已制定适当的 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 流程按钮:如果您想查看 step-by-step API 请求,请选择此按钮。

      • 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 验证访客访问权限,在内部扮演未经身份验证的角色 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 流程按钮:如果您想查看 step-by-step API 请求,请选择此按钮。

      • 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......" }

        此步骤中会发生什么:亚马逊 Cognito 从 cognito-identity.amazonaws.com 发布了一个短暂的 OpenID Connect 网络身份令牌,它代表了这一点。IdentityId该令牌包括 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 证书

使用临时证书

这些临时证书用作标准 Amazon 证书,但权限有限,由您的身份池未经身份验证的 IAM 角色定义。您可以将它们与任何 Amazon SDK 一起使用,或者 Amazon CLI。有关 Amazon SDKs 使用凭据进行配置的更多信息,请参阅《工具参考指南》 Amazon 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 令牌兑换临时证书。 Amazon 身份池也支持 Twitter 和 Apple 集成,但示例应用程序不支持。

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

Social identity provider with enhanced flow

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

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

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

  3. 选择 “增强流程” 选项卡。

  4. 选择您配置的支持的社交服务提供商,例如 “使用 Google 登录”、“使用 Faceboo k 登录” 或 “使用亚马逊登录”。

  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 流程按钮:如果您想查看 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......" }
      • GetId()使用您的身份池 ID 和包含您的社交服务提供商令牌Logins的地图的 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" }
      • 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 角色,然后 Amazon STS 代表您调用。然后,您的身份池返回了临时证书。

Social identity provider with basic flow

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

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

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

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

  4. 选择您配置的支持的社交服务提供商,例如 “使用 Google 登录”、“使用 Faceboo k 登录” 或 “使用亚马逊登录”。

  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 流程按钮:如果您想查看 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......" }
      • GetId()使用您的身份池 ID 和包含您的社交服务提供商令牌Logins的地图的 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" }
      • 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 令牌。应用程序 Amazon STS 直接调用以担任 IAM 角色并接收临时证书。

了解社交访问权限

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

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

  • 这些证书与专为经过身份验证的访问而设计的 IAM 角色相关联,提供比访客访问更广泛的权限。

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

本步骤探讨了使用用户池托管登录集成的 Amazon Cognito 身份验证。当您将用户池作为 IdP 链接到身份池时,用户池令牌会授权您的身份池颁发临时证书。

User pool authentication with enhanced flow

增强后的流程提供了一种通过单个 API 请求通过 Amazon Cognito 身份池获取 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 流程按钮:如果您想查看 step-by-step API 请求,请选择此按钮。

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

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

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

        { "id_token": "eyJraWQiOiJFWAMPLE......", "token_type": "Bearer", "expires_in": 3600 }
      • GetId()使用您的 API 请求identityPoolId以及包含Logins映射到的用户池提供商密钥的id_token地图。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" }
      • GetCredentialsForIdentity()返回的identityPoolId和 a=与. 的Logins映射相同 id_token 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. 在演示应用程序中,导航到 “交互式演示” 部分

  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 流程按钮:如果您想查看 step-by-step API 请求,请选择此按钮。

      • 该应用程序使用 Amazon Cognito 用户池登录用户,并获取身份令牌 (JWT) 作为构件。成功使用用户池进行身份验证后,您的应用程序会收到包含 ID 令牌 (JWT) 的 OAuth 响应。身份池使用此令牌进行身份验证:

        { "id_token": "eyJraWQiOiJFWAMPLE......", "token_type": "Bearer", "expires_in": 3600 }
      • GetId()使用您的身份池 ID 和包含您的用户池提供商密钥和 ID 令牌作为值的Logins映射的 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" }
      • 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......" }

        此步骤中会发生什么:亚马逊 Cognito 从 cognito-identity.amazonaws.com 发布了一个短暂的 OpenID Connect 网络身份令牌,它代表了这一点。IdentityId该令牌包括 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" } }

        您的演示应用程序做了什么:您的应用从向发送了 OpenID 令牌 GetOpenIdToken() Amazon STS,请求临时证书。 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 流程按钮:如果您想查看 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 响应:

        { "saml_response": "PD94bWwgdmVyc2lvbj0iMS4wIiBFWAMPLE...", "provider_arn": "arn:aws:iam::111122223333:saml-provider/EXAMPLE", "status": "Authentication successful" }
      • GetId()使用您的身份池 ID 以及包含您的 SAML 提供商 ARN 和断言Logins的地图的 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" }
      • 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 角色,然后代表您调用。 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 流程按钮:如果您想查看 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......" }
      • GetId()使用您的身份池 ID 和包含您的 OIDC 提供Logins商令牌的地图的 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" }
      • 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 角色(默认、基于声明或规则映射)并代表您调用。 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 流程按钮:如果您想查看 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......" }
      • GetId()使用您的身份池 ID 和包含您的 OIDC 提供Logins商令牌的地图的 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" }
      • 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 令牌。该应用程序 Amazon STS 直接调用以担任相应的 IAM 角色并收到短期证书。

了解 OIDC 身份验证

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

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

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

  • 企业集成:与流行的企业身份提供商合作。

后续步骤

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

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

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

  • 根据自己的用例自定义演示

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