签署具有未来到期和开始日期的 S3 URL

Signing an S3 URL with a future expiration AND start date

我们可以使用 JS SDK 为 S3 签名 URL,并设置到期日期:

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

我们还可以设置签名请求的有效日期吗?

假设我想以一种直到明天才有效的方式签署一个URL,然后在一天内有效。我该怎么做?最好用JS SDK。

S3 的预签名 URL 不直接提供此功能。

如果您改用 CloudFront signed URL with a custom policy,CloudFront 确实支持此功能。

您可以创建一个 CloudFront 分配,并将其连接到具有源访问身份的存储桶,这允许 CloudFront 对自身进行身份验证以访问该存储桶,然后 "Restrict viewer access" 在 CloudFront 分配上,以便 CloudFront 仅在提供有效的签名 CloudFront URL 时允许访问。 CloudFront 签名 URL 需要 "not after" 日期,但也支持 "not before" 日期。

您需要使用 CloudFront.Signer.getSignedUrl() 不要 提供 urlexpires 选项。仅传递 policy 选项。

policy 是一个 JSON 字符串,包含 ResourceDateLessThan(到期时间)和 DateGreaterThan(在此之前,访问 URL 将被拒绝)。您可以选择传递 IpAddress 以将此 URL 的使用限制为单个 IPv4 地址或块。不支持基于 IPv6 的限制。

这有点高级操作,但请参阅 these example policy statements 了解预期格式。示例中显示的空格不需要包含在策略文档中。

您不需要按照实际签名和转义 URL 的说明进行操作,因为 SDK 会为您处理该部分...但您需要创建 JSON政策。