我正在使用WordPress网站,该网站提供对Amazon S3上托管的文件的免费(但临时)访问权限。这将是我们对亚马逊SDK的单一用途,因此为了that function而将整个库及其依赖项包含在我们的服务器上似乎很荒谬。
有没有办法使用cURL(PHP)从我们的服务器传递指令并以其他方式从Amazon获取预先签名的URL?
答案 0 :(得分:2)
您从服务“获取”预先签名的URL是一种常见的误解,但事实并非如此。
它们是在您的代码中本地生成的(或在SDK代码中本地生成)。您的密钥用于生成URL表示的请求的规范表示的HMAC摘要。当服务收到请求时(例如,当点击URL时),服务将请求规范化,从您的秘密生成散列(不在URL中,但您和服务已知),如果结果匹配,请求被认为是经过身份验证并允许继续到授权阶段(以确保提供的访问密钥ID实际上具有允许请求的权限)。如果结果不匹配,则密钥或密钥错误,您身边的签名代码出错,或者签名后的签名URL已经过修改。访问被拒绝。
然后,没有服务端点返回签名的URL,尽管您可以使用Lambda和API网关相对轻松地为您的服务器创建一个服务端点。例如,Lambda for Node已经安装了SDK,因此您可以通过HTTPS传递URL并将URL返回。简单但有点傻。当然,您必须使用api密钥或秘密标头来验证来自您的应用程序的请求,因为您将无法使用本机身份验证,因为这需要SDK。 :)
生成自己的代码来创建签名的URL并不困难。该过程为fully documented,但您会在该页面上注明他们建议您使用SDK。我怀疑,其原因在于,即使您没有足够的编码能力来编写自己的算法实现,它也不会成为进入的障碍。
我已经编写了我自己的实现...实际上,我甚至编写了一个较旧的V2 signing algorithm的实现(它仍然适用于自2014年以来一直在线的任何区域)完全在SQL中,作为MySQL存储函数(例如SELECT get_signed_url('/bucket/key');
将一个签名的URL返回给GET
一个对象。凭证作为变量存储在函数内部... ...并且鉴于SQL可能是最不可能的语言你想到这样的操作,这很有效。
所以你可以自己写。
但我认为,出于维护原因包含SDK的反对意见是错误的。
AWS不会对其服务API进行重大更改。
他们没有。当S3引入ListObjects操作的第2版时,V1仍然可用。建议使用V2,但不推荐使用 ,也不能删除。
当引入签名版本4(如上所述)时,他们将其添加到所有旧区域,将签名版本2保留在已有的位置,并仅使用V4部署新区域。 Sig V2也不推荐使用,但推荐使用V4。 S3中的对象版本控制是以这样的方式编写的,即100%向后兼容不了解对象版本控制的代码。名单还在继续。
除了影响您的错误(不太可能)或与安全相关的事情(也不太可能)之外,任何SDK的当前版本都不需要在项目中替换,除非您想利用新功能,新服务或新的AWS区域,这可能不会经常发生在稳定的项目中。