自定义来源 Header 在 API 中不可见

Custom Origin Header not visible in the API

我有一个应用程序,其中客户端托管在具有 CloudFront 分发的 S3 上。 API 在带有 WAF 的 API 网关后面,客户端向 API 发出 http 请求以获取和 post 数据。

我想限制对 API 的访问,使其只能从客户端访问,并且当有人试图直接访问 API 时它应该 return 出错。

诀窍是 API 暴露给第三方,所以我不能使用 API 网关授权者,因为他们必须有直接访问权。

我在 CloudFront 中设置了一个自定义来源 Header (My-Secret-Header: 1234567890qwertyuiop),我想我可以在 WAF 中创建一个规则来允许带有此 header 的请求(加上第 3 方基于其他标准,但该部分运行良好,这不是问题),并阻止其他所有内容。

问题是 My-Secret-Header 永远不会进入 WAF,也不会添加到源自客户端应用程序的 http 请求中。

我还尝试使用 Lambda@Edge 添加自定义 header,但没有成功。我使用 Lambda@Edge 创建了大量日志,event.Records[0].cf.request.origin.s3.customHeaders 显示 My-Secret-Header(这是预期的)。

向客户端请求添加自定义 header 以便可以在 WAF 中创建规则的最佳方法是什么?

I want to restrict the access to the API such that it's only available from the client, and it should return an error when someone tries to access the API directly.

简短的回答是:没有办法做到这一点。无法判断请求是否来自浏览器中的 JavaScript、Postman 调用、用户在地址栏中键入 URL 等

CloudFront 中的自定义 Headers 不是 headers 添加到用户从提供的文件发出的 API 请求。它们是 headers,CloudFront 使用它来检索它所服务的静态源。在源位于 S3 存储桶中的情况下,这些自定义 headers 根据 CloudFront 用于从您的 S3 存储桶检索文件的请求。

一旦用户拥有 CloudFront 提供的文件(HTML、CSS、JavaScript、资产等),CloudFront 就不再是流程的一部分。在前端进行的任何 API 调用都不会通过 CloudFront。

有一些非常弱的方法可以完成您想要做的事情,但所有方法都可以轻松绕过,并且在任何需要安全性的情况下绝对不能使用。例如,您可以将 API 键和 hard-code 键放入应用程序中,但它完全暴露给可以访问该页面的任何人。 hard-coded 访问密钥 ID 和秘密访问密钥相同。

最终您需要的是一个身份验证系统,某种确保允许用户进行他们正在进行的 API 调用的方法。我不知道这是否适合您的用例,但 Amazon Cognito 是一项处理用户身份验证和联合的出色服务。