有什么方法可以生成没有任何到期日期的预签名 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?我正在开发一个电子邮件应用程序,我的附件将保存在 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。具体来说,您使用的签名版本以及您使用的 IAM 凭证类型。
可用于创建预签名 URL 的凭据包括:
特别注意:
有关更多信息,请参阅:
对您来说,一个解决方案可能是让 AWS CloudFront 分配为您的 S3 存储桶提供有限的访问权限,仅访问 Distribution Origin Access Identity,然后使用 CloudFront 签名的 url。哪个到期时间甚至可以以年为单位。因此,对于无限或半无限的 url,我会推荐这样的解决方案。
不确定是否要无限期保存附件。尽管如此,一种选择可能是您使用 API 网关。您将需要自己处理身份验证和授权。例如,您可以使用可以与数据库中的令牌进行比较的令牌。令牌授予对某个文件的访问权限,并且是请求 URL(或其请求标头)的一部分。但首先关于如何生成“预签名 URL”:
如果用户想要下载文件,他们打开步骤 3 中提供的 URL。API 网关调用授权 Lambda。此 Lambda 检查令牌是否仍在 DynamoDB 中。如果是这样,该请求将触发另一个 Lambda 函数,该函数将从令牌中提取文件名并返回文件。您必须返回编码的文件,正确设置响应标头并注意服务限制。
如果下载只能在您的应用程序内完成,并且该链接不能在应用程序外共享或使用,那么您可以跳过通过 API 网关返回文件。授权将保持如上所述。但 Lambda 函数不会返回文件,而是返回一个预签名的 URL,有效期可能为 10 分钟。您的应用程序将 URL 用于另一个请求并从 S3 接收文件。
至于您关于如何下载文件的问题的第二部分,那么简单fetch(preSignedS3URL)
就足够了。
在客户端,您可以执行以下操作:
const image = image.split('&Expires')[0]
这是我使用的解决方法之一