新闻动态

Our News

使用 Amazon Cognito 或自带身份提供者应用 Amazon Verified Permi

新闻动态

使用 Amazon Cognito 或自带身份提供者应用 Amazon Verified Permi

2026-01-27 12:40:04 9

使用 Amazon Verified Permissions 和 Amazon Cognito 授权 API 网关 APIs

关键要点

外部化应用程序 API 的授权逻辑可简化开发、审核和安全性。Amazon Verified Permissions 提供可扩展的权限管理和细粒度授权服务。新的控制台向导帮助开发者轻松设置 API 网关与身份提供者的集成,大幅减少手动配置的复杂性。

在应用程序API中外部化授权逻辑为AWS客户带来诸多好处,包括让开发团队专注于应用逻辑、简化应用程序和资源访问审计,以及通过持续授权提高应用程序的安全性。Amazon Verified Permissions 是一个可扩展的权限管理和细粒度授权服务,能够外部化应用程序授权。这意味着通过Cedar政策,您可以控制访问应用程序资源,仅允许授权用户访问API。然而,使用外部授权系统例如Verified Permissions的一个关键挑战是定义策略逻辑和与API集成所需的努力。本文将展示如何利用Verified Permissions加速保护托管在Amazon API Gateway上的REST API的过程,适用于使用Amazon Cognito或符合OpenID Connect (OIDC) 标准的身份提供者的客户。

设置 API 授权以使用 Amazon Verified Permissions

作为开发者,您需要完成几项任务以使用Verified Permissions存储和评估定义用户可以访问哪些API的策略。虽然Verified Permissions使您能够将授权逻辑与应用代码解耦,但您可能需要花时间学习Cedar策略语言、定义策略架构、撰写策略并将Verified Permissions集成到应用程序中。最后,您可能还需额外花时间开发和测试AWS Lambda授权器函数的逻辑,以构建用于Verified Permissions的授权请求并强制执行授权决定。对刚接触此服务的开发者来说,这可能是一个令人畏惧的任务。

风驰加速器15分钟试用

使用简化向导开始使用

Amazon Verified Permissions现已包含一个基于控制台的向导,您可以利用该向导快速创建构建块,以设置应用程序的API网关使用Verified Permissions进行授权。Verified Permissions根据您的API和策略生成授权模型,仅允许授权用户组访问API。此外,它还会部署一个Lambda授权器,您可以将其附加到希望保护的API上,附加后,API请求将由Verified Permissions进行授权。生成的Cedar策略和架构减少了学习曲线,同时允许您完全控制修改并确保满足安全要求。

使用 Amazon Cognito 或自带身份提供者应用 Amazon Verified Permi

示例应用程序概述

在本文中,我们将演示如何通过使用Verified Permissions控制台向导简化对示例应用程序API的安全性设定。我们使用了一个示例宠物商店应用程序,其中有两个资源:

资源名描述宠物商店一个基于 Amazon API Gateway 的 REST API,扩展了示例API并增加了用于管理的模拟集成。用户目录可用于定义用户及其属性的身份源,当用户请求访问应用程序资源时会用到。

宠物商店的授权需求如下,只有满足这些条件才能访问相应资源。所有其他请求将被拒绝。

经过身份验证的用户和未经身份验证的用户均可访问根URL。 GET /所有经过身份验证的用户都可以获取宠物列表或者通过标识符获取特定宠物。 GET /petsGET /pets/{petid}员工和所有者组可以添加新宠物。 POST /pets只有所有者组可以执行管理功能,这些功能通过API网关的代理资源实现。 ANY /admin/{proxy}

操作流程

Verified Permissions包括一个设置向导,它将Amazon Cognito用户池或OIDC IdP连接到API Gateway REST API,并基于组成员资格保护资源。以下是生成示例应用程序的授权构建块的向导操作流程。

设置基于用户组的API授权在AWS管理控制台的Amazon Verified Permissions页面,选择创建新的策略存储。在指定策略存储详细信息页面下,选择用API网关和身份提供者设置,然后选择下一步。

导入API资源和操作在导入资源和操作页面,选择API和部署阶段。选择宠物商店 API 和 演示 阶段。

选择导入API,这将生成导入资源和操作的映射。在我们这个示例中,包括Actionget /pets,Actionget /pets/{petId}以及Actionpost /pets。选择下一步。

选择身份源

在此步骤中,您需要配置应用程序用以认证和管理用户的身份源。您可以连接到现有的Amazon Cognito用户池或添加外部OIDC IdP。当使用现有Cognito用户池时,Verified Permissions会自动检索用户池配置,并允许您基于Cognito组分配权限。但在使用外部OIDC IdP时,您需要提供OIDC发行者URL并手动指定组配置。

选项 1:使用现有的Amazon Cognito用户池在选择身份源页面,选择Amazon Cognito。

在身份源部分,选择Cognito用户池在我们的示例中为PetStorePool。针对要传递给API的令牌类型,我们选择了默认值访问令牌。

选择下一步。在分配操作给组页面,选择可以在应用程序中执行操作的用户池组。选择完成后,继续下一步。

对于每个组,选择允许的操作。我们示例中员工组只能选择post /pets,所有者组选择所有的/admin/{proxy}操作。选择下一步。

选项 2:使用外部OIDC IdP在选择身份源页面,选择外部 OIDC 提供商。

输入您的发行者 URL。请注意,发行者 URL 必须托管 OIDC 发现文档。

选择令牌类型,建议选择访问令牌作为授权证书,选择提交。

在用户和组令牌声明中,输入 IdP 代表的声明。选择下一步。

在分配操作给组页面中输入组名称及允许的操作。选择继续添加更多组。

部署应用集成在部署应用集成页面,检查API Gateway 集成详细信息,并在开始为 API 授权部分选择现在。选择创建策略存储。

在创建策略存储总结页面,检查设置进度。选择检查部署以查看Lambda授权器的进度。

向导会部署一个CloudFormation堆栈和Lambda授权器,此授权器将为员工和所有者组授予对API网关资源的访问权限。

对于第二个用例,所有经过身份验证的用户应该有权访问的资源,需要单独的Cognito用户池授权器执行身份验证。在此示例中,我们可以使用以下AWS CLI命令创建授权器:

bashaws apigateway createauthorizer restapiid wrma51eup0 name CognitoPetStorePool type COGNITOUSERPOOLS identitysource methodrequestheaderAuthorization providerarns arnawscognitoidpuswest2000000000000userpool/uswest2iwWG5nyux

如果您使用自己的OIDC IdP,您可以修改策略以允许所有用户组访问,并跳过前面的步骤来配置Cognito授权器。

plaintextpermit( principal action in [PetStoreActionget /pets PetStoreActionget /pets/{petId}] resource)

完成CloudFormation堆栈部署和第二个Cognito授权器创建后,可以将两个授权器附加到宠物商店API资源,如图14所示。

在图14中,CognitoPetStorePool 是Cognito用户池授权器。由于本示例使用访问令牌,因此在附加到 GET /pets 和 GET /pets/{petId} 资源时,指定了授权范围如自定义范围petstore/api。

AVPAuthorizerXXX 是 基于请求参数 的Lambda授权器,它通过配置的身份源来确定调用者的身份。在图14中,这些源是Authorization (Header)、httpMethod (Context) 和 path (Context)。此授权器附加到 POST /pets 和 ANY /admin/{proxy} 资源。

这种多授权器组合与缓存减少了对Verified Permissions的授权请求次数。对于所有经过身份验证的用户可用的API调用,使用CognitoPetStorePool授权器而不是允许客户组的策略,有助于避免对Verified Permissions的收费授权请求。

授权缓存初始设置为120秒,可以在API Gateway控制台 配置。对于用户多次发起相同操作或有可预测的操作序列的应用程序,可以获得高缓存命中率。对于使用相同令牌的重复API调用,AVPAuthorizerXXX缓存将带来更低的延迟、每秒请求更少,并减少可收费请求的成本。请注意,使用缓存可能会延迟策略更新和执行之间的时间,这意味着对Verified Permissions的策略更新在超时或调用 FlushStageAuthorizersCache API 时才会生效。

部署架构

图15展示了使用Verified Permissions设置向导执行部署和配置步骤后的运行时架构。在用户通过Cognito宠物商店池或外部OIDC IdP进行身份认证后,对宠物商店API的API调用将使用访问令牌进行授权。Verified Permissions通过Lambda授权器执行细粒度授权。向导将自动为您创建以下四项内容:

连接到身份源Cognito用户池或外部OIDC IdP的Verified Permissions策略存储。定义用户和用户组实体、每个API Gateway资源操作的Cedar架构。根据员工和所有者组对相关操作分配权限的Cedar策略。配置在API网关中的Lambda授权器。

Verified Permissions使用 Cedar 策略语言 定义细粒度权限。默认情况下,授权响应的决策为“拒绝”。通过设置向导生成的Cedar策略可以确定“允许”决策。每个策略的主体是一个用户组实体,若用于Cognito作为身份源,实体ID格式为{user pool id}{group name};若使用OIDC IdP,实体ID格式为{OIDC Issuer URL}{group name}。策略中的操作ID代表一组选定的API Gateway HTTP方法和资源路径。请注意,post /pets 对员工和所有者都是允许的,而政策范围内的资源没有被特别指定,因为该资源隐含为应用程序。

plaintextpermit ( principal in PetStoreUserGroupuswest2iwWG5nyuxemployees action in [PetStoreActionpost /pets] resource)

permit ( principal in PetStoreUserGroupuswest2iwWG5nyuxowners action in [PetStoreActiondelete /admin/{proxy} PetStoreActionpost /admin/{proxy} PetStoreActionget /admin/{proxy} PetStoreActionpatch /admin/{proxy} PetStoreActionput /admin/{proxy} PetStoreActionpost /pets] resource)

验证API安全性

您可以通过使用不同的访问令牌和基于终端的cURL命令来验证策略和API访问。为了可读性,环境变量表示实际值。TOKENC、TOKENE和TOKENO包含对应于客户、员工和所有者组的有效访问令牌。 APISTAGE 是我们之前选择的宠物商店API和演示阶段的基本URL。

测试未经过身份验证的用户是否可访问 GET / 根路径正如概述部分描述的需求1,但不得调用 GET /pets API需求2,可以运行以下cURL命令。CognitoPetStorePool授权器应返回 {messageUnauthorized}。

bashcurl X GET {APISTAGE}/

欢迎来到您的宠物商店API

curl X GET {APISTAGE}/pets{messageUnauthorized}

要测试已过身份验证的用户是否允许通过访问令牌因为CognitoPetStorePool授权器调用GET /pets API需求2,可以运行以下cURL命令。用户在尝试调用POST /pets API时应收到错误消息需求3,因为AVPAuthorizer不允许此操作。客户组未定义动作post /pets的Cedar策略。

bashcurl H Authorization Bearer {TOKENC} X GET {APISTAGE}/pets[ { id 1 type dog price 24999