首页 文章

CloudFront背后的API网关是否不支持AWS_IAM身份验证?

提问于
浏览
5

似乎无法调用通过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 回答

  • 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不会能够缓存经过身份验证的请求的任何响应,因为每个请求的缓存键都会有所不同 .

  • 1

    如果为API设置了自定义域,API网关现在使用自定义域作为主机生成签名 .

    https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

    使用API Gateway作为源手动创建CloudFront分配不起作用 .

相关问题