如何为 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.js
的 node.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 预检兼容。只需在资源上创建您需要的各个方法(GET
、POST
等...)让它继承授权设置,然后创建 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?