似乎无法调用通过CloudFront分配启用AWS_IAM保护的REST API .
以下是如何重现这个:
-
使用API网关创建REST API
-
使用AWS_IAM身份验证保护REST API方法
-
创建面向REST API的CloudFront分发
-
在Route 53中创建一个以CloudFront Distribution为目标的A记录
现在使用经过身份验证的用户(我使用Cognito UserPool用户和aws-amplify)来调用
- 受保护的REST API方法及其API网关URL = SUCCESS
通过CloudFront分发URL = FAILURE - 受保护的REST API方法
通过Route 53域URL = FAILURE - 受保护的REST API方法
我得到的错误是:
{“message”:“我们计算的请求签名与您提供的签名不匹配 . 请检查您的AWS秘密访问密钥和签名方法 . 有关详细信息,请参阅服务文档 . ”}
我无法相信AWS不支持自定义域后面的AWS_IAM受保护 endpoints ,因为这必须是一个非常常见的用例 .
因此,请您提供一份如何实现这一目标的详细清单?
谢谢
2 回答
我怀疑这是不可能的,原因有两个 .
IAM身份验证 - 特别是Signature V4 - 隐含地假设客户端正在访问的主机名也是通过其访问服务的主机名 .
API网关 endpoints 期望使用其自己的主机名对请求进行签名,作为签名过程中使用的主机头 . 这可以通过签署API网关 endpoints 的请求,然后将URL更改为指向CloudFront endpoints 来解决 .
但是,如果你这样做,我希望CloudFront添加到请求的
x-amz-cf-id
标头也会使得无法通过有效的签名,因为x-amz-*
Headers 需要签名 - 这是不可能的,因为你没有't know that header'的值 .我不确定是否有解决方法,但是......如果您使用的是IAM身份验证,使用CloudFront的唯一优势就是将服务保持在与网站其余部分相同的域名下 - CloudFront不会能够缓存经过身份验证的请求的任何响应,因为每个请求的缓存键都会有所不同 .
如果为API设置了自定义域,API网关现在使用自定义域作为主机生成签名 .
https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html
使用API Gateway作为源手动创建CloudFront分配不起作用 .