83

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

我正在使用下面的代码

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

5 回答 5

99

预签名 url 的最长过期时间是从创建之日起一周。因此,没有过期时间就没有办法拥有一个预签名的 url。

于 2015-09-08T08:41:50.083 回答
25

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

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

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

特别注意:

  • 签名 v2可能已被弃用
  • 签名 v2 的到期限制与签名 v4 不同
  • 签名 v4比 v2提供了一些安全性和效率优势
  • 如果您使用 STS 凭据生成预签名 URL,则该 URL 将在 STS 凭据过期时过期,如果这早于您为预签名 URL 请求的显式过期
  • 创建在纪元结束前有效的预签名 URL 不是最佳安全实践

有关更多信息,请参阅:

于 2019-09-04T16:44:50.127 回答
11

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

于 2019-09-24T10:48:21.863 回答
0

不确定是否要无限期保存附件。尽管如此,一种选择可能是您使用 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 函数,该函数将从令牌中提取文件名并返回文件。您必须返回编码的文件,正确设置响应标头并注意服务限制

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

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

于 2022-01-04T14:13:15.433 回答
-7

在客户端,您可以执行以下操作:

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

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

于 2020-09-16T06:54:00.513 回答