【问题标题】:Can cURL/PHP remotely request a presigned URL for an Amazon S3 Object?cURL/PHP 能否远程请求 Amazon S3 对象的预签名 URL?
【发布时间】:2017-07-06 09:45:25
【问题描述】:

我正在开发一个 WordPress 网站,该网站提供对托管在 Amazon S3 上的文件的免费(但临时)访问。这将是我们对 Amazon SDK 的唯一用途,因此为了that function 而包含他们的整个库及其对我们服务器的依赖项似乎很荒谬。

有没有办法使用 cURL (PHP) 从我们的服务器传递指令并以其他方式从亚马逊获取预签名 URL?

【问题讨论】:

  • 磁盘空间便宜
  • 重点不是磁盘空间。它正在成为数千行代码的保管人,然后我必须保持更新。
  • 您需要使用 Composer,这将使代码保持最新。您可以免除 AWS 代码的版本控制。使用可用的库几乎总是比编写自己的代码更好,尤其是像 Amazon 这样复杂的服务。
  • 所以亚马逊没有这类事情的请求端点?
  • 确实如此,而且很多人都在使用它们。

标签: php curl amazon-s3


【解决方案1】:

您从服务中“获取”预签名 URL 是一种常见的误解,但事实并非如此。

它们是在您的代码中本地生成的(或在 SDK 代码中本地生成的)。您的密钥用于生成 URL 表示的请求的规范表示的 HMAC 摘要。当服务接收到请求时(例如,单击 URL 时),服务会规范化请求,从您的密钥(不在 URL 中,但您和服务都知道)生成哈希,如果结果匹配时,请求被认为是经过身份验证的,并被允许继续到授权阶段(以确保提供的访问密钥 ID 实际具有允许请求的权限)。如果结果不匹配,则说明密钥或密钥错误,您这边的签名代码出错,或者签名后的 URL 已被修改。访问被拒绝。

虽然您可以使用 Lambda 和 API 网关相对轻松地创建一个供您的服务器调用的服务端点,但没有返回签名 URL 的服务端点。例如,Lambda for Node 已经安装了 SDK,因此您可以通过 HTTPS 传入 URL 并返回 URL。简单但有点傻。当然,您必须使用 api 密钥或秘密标头对来自应用程序的请求进行身份验证,因为您将无法使用本机身份验证,因为这需要 SDK。 :)

生成您自己的代码来创建签名 URL 并不难。该过程是fully documented,尽管您会在该页面上注意到他们建议您使用 SDK。我怀疑这样做的原因是,即使你没有足够的编码能力来编写自己的算法实现,它也不会成为进入的障碍。

我已经编写了我自己的实现...事实上,我什至完全用 SQL 编写了旧的 V2 signing algorithm 的实现(它仍然适用于自 2014 年之前上线的任何区域),如一个 MySQL 存储函数(例如,SELECT get_signed_url('/bucket/key'); 将签名的 url 返回到 GET 一个对象。凭据作为变量存储在函数内部)......并且考虑到 SQL 可能是你最不可能想到的语言一个手术,这个效果很好。

所以你可以自己写。

但我认为,出于维护原因而反对包含 SDK 是错误的。

AWS 不会对其服务 API 进行重大更改。

他们只是没有。当 S3 引入 ListObjects 操作的第 2 版时,V1 仍然可用。建议使用 V2,但 V1已被弃用,也不会被删除。

在引入 Signature Version 4(如上所述)时,他们将其添加到所有旧区域,将 Signature Version 2 保留在已经可用的位置,并仅使用 V4 部署新区域。 Sig V2 也未被弃用,但建议使用 V4。 S3 中的对象版本控制是这样编写的,它与不理解对象版本控制的代码 100% 向后兼容。名单还在继续。

没有影响您(不太可能)的错误或与安全相关的内容(也不太可能),任何 SDK 的当前版本都不需要在您的项目中替换,除非您想利用新功能、新服务,或新的 AWS 区域,这在稳定的项目中可能不会经常发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 2018-12-27
    • 2021-02-26
    • 2021-10-18
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多