如何为 CORS 预检请求绕过 AWS API Gateway 代理资源上的 Cognito 授权方?

Posted

技术标签:

【中文标题】如何为 CORS 预检请求绕过 AWS API Gateway 代理资源上的 Cognito 授权方?【英文标题】:How to bypass Cognito authorizer on AWS API Gateway proxy resource for CORS preflight requests? 【发布时间】:2022-01-10 02:20:57 【问题描述】:

我有一个非常简单的 API Gateway 资源配置:

ANY 方法指向运行 express.jsnode.js lambda。 Express.js 然后负责路由、CORS 请求等。API 将由单页 javascript 应用程序使用。

几乎所有端点都需要授权,所以我在ANY方法中添加了Cognito授权器。但是,此设置会破坏 CORS 预检请求,因为预检请求不能携带 Authorization 标头。

    如何使预检请求绕过Cognito 授权方? (可选)如何使一些选定的端点绕过Cognito 授权方(用于 GET)? 除了必须在 API Gateway 资源设计器中复制我的所有路由之外,是否有任何解决方案?

我能想到的唯一解决方案是使用 Application Load Balancer 而不是 API Gateway,并在 lambda 函数中编写自己的 Cognito 授权器。

另一种解决方案可能是使用 cognito-express 代替 AWS 提供的 Cognito 授权方。不过,出于安全原因,我自然更喜欢 AWS 提供的授权方。

【问题讨论】:

您使用的是代理还是非代理集成? @kgiannakakis 代理集成 尝试在 ANY 请求之前添加一个 OPTIONS 请求。 @kgiannakakis 是不是只会影响单个资源而不是应用于所有子资源? 【参考方案1】:

您不能将ANY 方法与授权方一起使用,并期望 OPTIONS 与 CORS 预检兼容。只需在资源上创建您需要的各个方法(GETPOST 等...)让它继承授权设置,然后创建 OPTIONS 方法并将授权设置显式设置为无。

【讨论】:

这听起来像是我的问题中的第 3) 点。 @Paya 啊不知道你的意思是什么意思。您应该在 IaC 中维护一些东西,例如 cloudformation 或 CDK。 同意 CDK,但这仍然需要复制路由(这次在 CDK 中)或放弃 expressjs/proxy-resource 设计并为每个端点使用专用 lambda。尽管如此,我后来发现的cognito-express 似乎工作正常,并且可以实现所需的设计。虽然它不太理想,因为如果可能的话,我宁愿重用“内置”AWS 授权器。

以上是关于如何为 CORS 预检请求绕过 AWS API Gateway 代理资源上的 Cognito 授权方?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS API Gateway 为 CORS 预检请求设置配额

如何为 AWS API Gateway 自定义授权方配置 CORS?

AWS API Gateway CORS 问题 - JS

nodejs api没有框架,如何绕过CORS?

AWS 中的 403 OPTIONS Cors 错误,预检请求

Slim 框架上 CORS 期间的预检授权标头