Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 自定义源标题在API中不可见_Amazon Web Services_Amazon S3_Aws Api Gateway_Amazon Cloudfront_Amazon Waf - Fatal编程技术网

Amazon web services 自定义源标题在API中不可见

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中创建

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

我想限制对API的访问,使其仅从客户端可用,并且当有人试图直接访问API时,它应该返回一个错误

诀窍是API向第三方公开,所以我不能使用API网关授权程序,因为它们必须具有直接访问权限

我在CloudFront中设置了一个自定义的源报头(
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这样的授权服务器可以解决这个问题,我只需要一些短期的解决方案。