【问题标题】:AWS S3 pre signed URL without Expiry date没有到期日期的 AWS S3 预签名 URL
【发布时间】:2014-06-03 11:43:27
【问题描述】:

有没有什么方法可以生成没有任何到期日期的预签名 URL? 我正在开发一个电子邮件应用程序,我的附件将保存在 S3 中。 另外请让我知道通过 JavaScript SDK 下载附件的最佳方式是什么。

我正在使用下面的代码

var params = {Bucket: 'bucket', Key: 'key', Expires: 60};
var url = s3.getSignedUrl('getObject', params);
console.log('The URL is', url);

【问题讨论】:

  • 答案是,你不能!它显然违背了拥有签名 URL 的目的,您可以在给定的时间后过期并强制执行访问控制。如果你不想让你的 URL 过期,你可以很好地使用公共对象。
  • 我们可以在这里尝试一些技巧,将图像名称和 s3 存储桶名称保存到数据库中而不是预签名的 url,并在显示时创建具有最长过期时间的“预签名”URL 并发送到浏览器。

标签: amazon-web-services amazon-s3 pre-signed-url


【解决方案1】:

预签名 url 的最大过期时间是 one week 从创建时开始。因此,没有过期时间就没有预签名的 url。

【讨论】:

  • 您是否有指向该文档的链接?我在任何地方都找不到它。那将非常有帮助。谢谢。
  • 我没有在任何文档中看到这一点。我在 aws sdk 附带的 presign_v4 文件的源代码中的注释中找到了。在我的情况下,它是通过安装 ruby​​ aws sdk gem v 1.58 来安装的 ruby​​ sdk。确切的位置是 Home/Library/Ruby/Gems/2.0.0/gems/aws-sdk-v1-1.58.0/lib/aws/s3/presign_v4.rb
  • 酷,谢谢。后来发现here“你可以设置的最小值是1,最大值是604800(7天)。”
  • 使用签名 v4 时适用 7 天限制。
  • 最大过期时间取决于其他一些事情。这里有很好的解释:aws.amazon.com/premiumsupport/knowledge-center/…
【解决方案2】:

这取决于您如何生成 S3 预签名 URL。具体来说,您使用的签名版本以及您使用的 IAM 凭证类型。

可用于创建预签名 URL 的凭据包括:

  • IAM 实例配置文件(临时、轮换凭证):有效期最长为 6 小时
  • STS(临时凭证):有效期长达 36 小时
  • IAM 用户(长期凭证):使用签名 v4 时有效期最长为 7 天
  • IAM 用户(长期凭证):在使用签名 v2 时有效期至 end of the epoch

特别注意:

  • 签名 v2 是 potentially deprecated
  • 签名 v2 的过期限制与签名 v4 不同
  • signature v4 比 v2 提供了一些 security and efficiency benefits
  • 如果您使用 STS 凭据生成预签名 URL,则该 URL 将在 STS 凭据过期时过期,如果该过期时间早于您为预签名 URL 请求的显式过期时间
  • 创建在 epoch 结束前有效的预签名 URL 并不是最佳安全实践

更多信息,请参见:

【讨论】:

  • IAM 实例配置文件每 6 小时回收一次这一事实让我非常头疼。谢谢!
【解决方案3】:

对您而言,一个解决方案可能是让 AWS CloudFront 分配为您的 S3 存储桶提供服务,但只能有限访问 Distribution Origin Access Identity,然后使用 CloudFront 签名的 url。哪个到期时间甚至可以以年为单位。因此,对于无限或半无限的 url,我会推荐这样的解决方案。

【讨论】:

【解决方案4】:

不确定是否要无限期保存附件。尽管如此,一种选择可能是您使用 API 网关。您将需要自己处理身份验证和授权。例如,您可以使用可以与数据库中的令牌进行比较的令牌。令牌授予对某个文件的访问权限,并且是请求 URL(或其请求标头)的一部分。但首先关于如何生成“预签名 URL”:

  1. 当附件上传到 S3 时,您会生成一个带有文件名的令牌,即 JWT 令牌。
  2. 将令牌保存在 DynamoDB 中,如果需要,可能带有到期日期
  3. 将 API 网关 URL 和生成的令牌返回给用户,例如https://get-your-attachment.io/download?token=123
  4. 如果令牌过期,请使用 DynamoDB 流在 S3 中查找文件并将其从 S3 中删除以进行清理

如果用户想要下载文件,他们打开步骤 3 中提供的 URL。API 网关调用授权 Lambda。此 Lambda 检查令牌是否仍在 DynamoDB 中。如果是这样,该请求会触发另一个 Lambda 函数,该函数将从令牌中提取文件名并返回文件。您必须返回编码的文件,正确设置响应标头并注意service limits

如果只能在您的应用内完成下载,并且无法在应用外共享或使用该链接,那么您可以跳过通过 API 网关返回文件。授权将保持如上所述。但 Lambda 函数不会返回文件,而是返回一个预签名的 URL,有效期可能为 10 分钟。您的应用将 URL 用于另一个请求并从 S3 接收文件。

关于如何下载文件的问题的第二部分,简单fetch(preSignedS3URL) 就足够了。

【讨论】:

    【解决方案5】:

    在客户端你可以这样做:

    const image = image.split('&Expires')[0]

    这是我使用的解决方法之一

    【讨论】:

    • 这行不通。 OP 正在寻求一种方法来生成没有过期日期的链接(换句话说,不能过期)。删除 Expires= 只会使 URL 无效且无法使用。你误解了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多