您从服务中“获取”预签名 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 区域,这在稳定的项目中可能不会经常发生。