首页 > 解决方案 > 签署具有未来到期和开始日期的 S3 URL

问题描述

我们可以使用 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。

标签: amazon-s3aws-sdk-js

解决方案


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

如果您改为使用CloudFront 签名 URL 和自定义策略,CloudFront 确实支持这一点。

您可以创建 CloudFront 分配,并使用原始访问身份将其连接到存储桶,这允许 CloudFront 对自己进行身份验证以访问存储桶,然后在 CloudFront 分配上“限制查看器访问”,以便 CloudFront 仅在有效时允许访问提供了签名的 CloudFront URL。CloudFront 签名 URL 需要“不晚于”日期,但也支持“不早于”日期。

您需要使用CloudFront.Signer.getSignedUrl()提供urlorexpires选项。仅通过policy选项。

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

这是一项高级操作,但请参阅这些示例策略语句以了解预期格式。示例中显示的空格不需要包含在策略文档中。

您无需按照说明实际签署和转义 URL,因为 SDK 正在为您处理该部分……但您需要创建 JSON 策略。


推荐阅读