【发布时间】:2021-07-05 22:14:58
【问题描述】:
我有一个由 S3 存储桶 (b1) 支持的静态网站,带有 Cloudfront Web 分发版。分配上的行为允许访问此存储桶。
我有另一个 S3 存储桶 (b2),其中包含配置为仅通过云端 URL 访问的私有内容(使用 S3OriginConfig 和行为进行配置)。
b1 和 b2 都配置了 publicReadAccess 被阻止并设置了 BlockPublicAccess.BLOCK_ALL。
我已经配置了一个云端原始访问身份来访问公共和私有 s3 存储桶内容并且它可以工作。
例如:http://myapp.cloudfront.net/private_content.jpg 映射到 b2,因为 *.jpg 路径模式配置为访问保存 jpg 文件的私有存储桶 b2,http://myapp.cloudfront.net 将我带到为分发配置的索引页面。
我想使用本文档中所述的签名 cookie 来防止在未经适当授权的情况下访问私人内容: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html
具体来说,文档中的第2点:
- 您开发应用程序以确定用户是否应该拥有 访问您的内容,如果是,发送三个 Set-Cookie 标头到 查看器。 (每个 Set-Cookie 标头只能包含一个 name-value 对,而 CloudFront 签名的 cookie 需要三个名称-值对。) 您必须在查看器之前将 Set-Cookie 标头发送给查看器 请求您的私人内容。如果您在 cookie,您可能还想再发送三个 Set-Cookie 标头 响应后续请求,让用户继续拥有 访问。
即,要求是仅在经过身份验证的情况下才允许查看者访问私有内容。
如何处理静态网站(我的是一个使用 HTML + JS 文件的单页应用程序)?
其他细节:
- 我使用 AWS cognito 对用户进行身份验证,并使用 cognito 身份池对我的应用程序中的用户进行授权。
- SPA 应用程序对 API 网关进行后端 Rest API 调用。因此,我可以插入 Set-Cookie 标头的一个位置是在调用的第一个 API 调用中。但是,目前这是一个不同的 URL(不在云端分发中),并且 web 应用程序发出的 API 调用是 CORS。
问题:
- 推荐的方法是确保只有经过身份验证的用户才能访问私有内容? (欢迎提出更简单、更安全的建议)
- 如果要采用 Set-Cookie/云端签名 cookie 方法,我是否应该使用路径路由将 API 也置于云端(这也将简化 CORS)?
【问题讨论】:
-
为什么不使用 CloudFront 签名 URL?
-
我正在使用本文档参考中提供的指导:docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/… 具体而言,在以下情况下使用签名 cookie:您希望提供对多个受限文件的访问权限,例如,所有HLS 格式的视频文件或网站订阅者区域中的所有文件。您不想更改当前的 URL。 对于我的应用,我不想更改 URL。因此使用签名的 cookie。
-
看起来 lambda@Edge 可能是解决这个问题的方法。通过阅读文档,处理私有内容的 lambda@Edge 函数是在云端分发中定义的,并且由于云端缓存可以跨所有区域复制,它应该卸载原始负载,并且 lambda 可以处理预检 OPTIONS 和 GET 私有内容,授权后重定向到原点。这将跳过 api 网关。这在理论上应该可行;在向 a.url (cf) 发出请求并且重定向到不同域 b.url (s3 url) 的情况下,来自 lambda@Edge 的重定向是否有效?
标签: amazon-web-services aws-api-gateway amazon-cognito amazon-cloudfront