如何测试 S3 预签名 GET url 以查看它是否已过期,如果已过期则重新生成它,在 Rails/Coffeescript 上使用 Ruby

How to test an S3 Presigned GET url to see if it has expired, and regenerate it if it has, using Ruby on Rails/Coffeescript

我正在 Rails 上的 Ruby 中构建文档管理系统,该系统使用 Amazon S3 进行存储。我正在为 uploading/downloading 文件使用 carrierwave 和 carrierwave-aws gem。

我让它工作到可以生成预签名 url 的地方,它会在一定时间后过期(越快越好......可能 10 秒到 1 分钟),但问题是我'我遇到的情况是,如果有人加载了页面但没有立即单击 "Download" 按钮,那么 link 就会过期并且他们会被引导到丑陋的 XML 错误。

我想弄清楚的是:

  1. 如何在单击下载按钮时即时生成预签名的 url(我正在考虑使用 Coffeescript)或

  2. 继续并在页面加载时生成预签名的 url,但是当单击下载时,以某种方式检查它是否 returns 错误,如果是,则获取新的预签名 url 并在那时重定向到它。 (再次,考虑 Coffeescript,如果可能的话)

过去,我对类似的问题采取了以下完全服务器端的方法(不使用载波,但不应该相关)。

将下载按钮 link 添加到您应用中的 controller/action,并传递文档的 ID。然后,您的控制器操作会生成一个预先签名的 URL,然后将用户重定向到那个 URL。

理论上,这种预签名 url 只需要很短的生命周期,但如果文件大到用户可能想要暂停和恢复传输,那么更长的生命周期可能是可取的。