我想将映射图块存储在私有 S3 存储桶中。每个图块都有自己的 URL,每组图块可能有 GB 的图块。
然后我想通过前端映射客户端(例如传单)可视化这些图块。此客户端使用磁贴的单独 URL 在需要时提取磁贴。
因为存储桶是私有的,所以我需要对每个磁贴请求进行身份验证,但性能对于这个应用程序来说相当关键。
鉴于我想使用 heroku 来托管我的网站,在从 S3 请求磁贴或通过 heroku 代理磁贴本身之前,最好通过 heroku 代理 url 并对其进行签名?
还有其他选择吗?
理想情况下,我认为您希望通过授权访问 S3 存储桶的服务器代理请求,以最大程度地减少身份验证事务。
无论是否在 Heroku 上,只要代理服务器能够验证最终用户的访问权限并根据所需的安全策略维护该会话,就可以了。
Cesium 确实支持 Imagery 和 Terrain 的代理,所以一旦到位,您应该只需要在您的服务器上配置 CesiumProxy 就可以了。
如果 S3 中的内容是私有的,您将不得不以一种或另一种方式授权下载,除非存储桶策略允许代理无需基于其 IP 地址进行身份验证即可访问内容。即使这样,代理仍然需要验证用户是否通过(可能)cookie 获得授权,这可能意味着会话数据库查找。
生成签名 URL 在计算上并不是一个特别昂贵的过程,并且(与我偶尔遇到的印象相反)签名过程完全在您的服务器上完成——在生成签名 URL 时不会发生与 S3 的实际交互。
没有一个真正的正确答案。我使用这两种方法,以及它们的组合——在应用程序中签名 URL,在数据库中对它们进行签名(我已经编写了一个对 URL 进行签名的 MySQL 存储函数),提供到读取用户会话 cookie 的不同应用服务器的链接并且,如果获得授权,生成签名 URL 并返回 302 重定向,提供指向代理服务器的链接,该代理服务器将预签名 URL 请求代理到 S3(用于实时日志记录并允许我使用自己的域名和 SSL 证书)...所有这些方法和其他方法都有有效的用例。