Amazon web services 自定义源标题在API中不可见
我有一个应用程序,其中客户端托管在带有CloudFront发行版的S3上。API位于带有WAF的API网关后面,客户端向API发出http请求以获取和发布数据 我想限制对API的访问,使其仅从客户端可用,并且当有人试图直接访问API时,它应该返回一个错误 诀窍是API向第三方公开,所以我不能使用API网关授权程序,因为它们必须具有直接访问权限 我在CloudFront中设置了一个自定义的源报头(Amazon web services 自定义源标题在API中不可见,amazon-web-services,amazon-s3,aws-api-gateway,amazon-cloudfront,amazon-waf,Amazon Web Services,Amazon S3,Aws Api Gateway,Amazon Cloudfront,Amazon Waf,我有一个应用程序,其中客户端托管在带有CloudFront发行版的S3上。API位于带有WAF的API网关后面,客户端向API发出http请求以获取和发布数据 我想限制对API的访问,使其仅从客户端可用,并且当有人试图直接访问API时,它应该返回一个错误 诀窍是API向第三方公开,所以我不能使用API网关授权程序,因为它们必须具有直接访问权限 我在CloudFront中设置了一个自定义的源报头(My Secret Header:1234567890qwertyuiop),我想我可以在WAF中创建
My Secret Header:1234567890qwertyuiop
),我想我可以在WAF中创建一个规则,允许使用此报头的请求(加上基于其他标准的第三方,但该部分工作正常,并且不是问题),并阻止其他所有请求
问题是,My Secret Header
从未发送到WAF,也没有添加到来自客户端应用程序的http请求中
我还尝试添加带有Lambda@Edge没有成功。我在中创建了大量日志Lambda@Edge,并且事件.Records[0].cf.request.origin.s3.customHeaders
显示我的秘密头(这是预期的)
向客户机请求添加自定义头以便在WAF中创建规则的最佳方法是什么
我想限制对API的访问,使其仅从客户端可用,并且当有人试图直接访问API时,它应该返回一个错误
简单的回答是:没有办法做到这一点。无法判断请求是否来自浏览器中的JavaScript、邮递员呼叫、用户在地址栏中键入URL等
CloudFront中的自定义头不是添加到用户从服务文件发出的API请求中的头。它们是CloudFront用来检索其服务的静态源的头文件。如果源文件位于S3存储桶中,则CloudFront将根据请求使用这些自定义头从S3存储桶中检索文件
一旦用户拥有CloudFront提供的文件(HTML、CSS、JavaScript、资产等),CloudFront就不再是流程的一部分。在前端进行的任何API调用都不会经过CloudFront
有一些非常弱的方法可以做你想做的事情,但是所有的方法都很容易被绕过,并且在任何需要安全性的情况下都绝对不能使用。例如,您可以制作一个API密钥并将其硬编码到应用程序中,但它完全公开给任何可以访问该页面的人。硬编码的访问密钥ID和秘密访问密钥也是如此
最终,您需要的是一个身份验证系统,以某种方式确保允许用户进行他们正在进行的API调用。我不知道这是否适合您的用例,但AmazonCognito是一个处理用户身份验证和联合的优秀服务
我想限制对API的访问,使其仅从客户端可用,并且当有人试图直接访问API时,它应该返回一个错误
简单的回答是:没有办法做到这一点。无法判断请求是否来自浏览器中的JavaScript、邮递员呼叫、用户在地址栏中键入URL等
CloudFront中的自定义头不是添加到用户从服务文件发出的API请求中的头。它们是CloudFront用来检索其服务的静态源的头文件。如果源文件位于S3存储桶中,则CloudFront将根据请求使用这些自定义头从S3存储桶中检索文件
一旦用户拥有CloudFront提供的文件(HTML、CSS、JavaScript、资产等),CloudFront就不再是流程的一部分。在前端进行的任何API调用都不会经过CloudFront
有一些非常弱的方法可以做你想做的事情,但是所有的方法都很容易被绕过,并且在任何需要安全性的情况下都绝对不能使用。例如,您可以制作一个API密钥并将其硬编码到应用程序中,但它完全公开给任何可以访问该页面的人。硬编码的访问密钥ID和秘密访问密钥也是如此
最终,您需要的是一个身份验证系统,以某种方式确保允许用户进行他们正在进行的API调用。我不知道这是否适合您的使用情况,但Amazon Cognito是一项处理用户身份验证和联合的优秀服务。感谢您花时间撰写您的答案。我接受了它,因为我得出了相同的结论。像Cognito这样的授权服务器可以解决这个问题,我只需要一些短期的解决方案。谢谢你花时间写下你的答案。我接受了它,因为我得出了相同的结论。像Cognito这样的授权服务器可以解决这个问题,我只需要一些短期的解决方案。