我正在使用 NodeJs 将文件上传到 AWS S3。我希望客户端能够安全地下载文件。所以我试图生成签名的 URL,在使用一次后过期。我的代码如下所示:
上传
const s3bucket = new AWS.S3({
accessKeyId: 'my-access-key-id',
secretAccessKey: 'my-secret-access-key',
Bucket: 'my-bucket-name',
})
const uploadParams = {
Body: file.data,
Bucket: 'my-bucket-name',
ContentType: file.mimetype,
Key: `files/${file.name}`,
}
s3bucket.upload(uploadParams, function (err, data) {
// ...
})
下载
const url = s3bucket.getSignedUrl('getObject', {
Bucket: 'my-bucket-name',
Key: 'file-key',
Expires: 300,
})
问题
打开网址时,我得到以下信息:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AccessDenied</Code>
<Message>
There were headers present in the request which were not signed
</Message>
<HeadersNotSigned>host</HeadersNotSigned>
<RequestId>D63C8ED4CD8F4E5F</RequestId>
<HostId>
9M0r2M3XkRU0JLn7cv5QN3S34G8mYZEy/v16c6JFRZSzDBa2UXaMLkHoyuN7YIt/LCPNnpQLmF4=
</HostId>
</Error>
我无法找到错误。我真的很感激任何帮助:)
原文由 Flo 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的代码是正确的,请仔细检查以下内容:
您的存储桶访问策略。
您通过 API 密钥获得的存储桶权限。
您的 API 密钥和秘密。
您的存储桶名称和密钥。
对于存储桶策略,您可以使用以下内容:
使用您的存储桶名称更改 存储 桶。
对于用户和访问密钥权限(#2),您应该按照以下步骤操作:
1-转到 AWS 身份和访问管理 (IAM) 并单击策略链接并单击“创建策略”按钮。
2-选择 JSON 选项卡。
3-输入以下语句,确保更改存储桶名称并单击“review policy”按钮。
4-输入您的策略的名称,然后单击“创建策略”按钮。
5-单击用户链接,找到您当前的用户名(您已经拥有访问密钥和密码)
6-单击“添加权限”按钮。
7-添加我们在上一步中创建的策略并保存。
最后,确保您的存储桶无法从公共访问,将正确的内容类型添加到您的文件并设置
signatureVersion: 'v4'
最终的代码应该是这样的,感谢@Vaisakh PS: