【发布时间】:2019-03-11 01:38:41
【问题描述】:
我正在使用 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>
我无法找到错误。我真的很感激任何帮助:)
【问题讨论】:
-
任何拥有有效安全凭证的人都可以创建预签名 URL。但是,为了让您成功上传对象,预签名 URL 必须由有权执行预签名 URL 基于docs.aws.amazon.com/AmazonS3/latest/dev/… 的操作的人创建。您的 IAM 策略是否有权访问 S3 存储桶?如果文件在您的存储桶中成功生成,并且在您创建签名网址后您无法立即访问它,请检查您传递给
getSignedUrl的文件名和存储桶是否有效 -
有没有办法检查 IAM 策略是否有权访问存储桶?
-
确实,检查这一点的快速方法就是查看您的存储桶并确认对象已创建。因为您收到了
AccessDeniedresponse,请尝试检查您的存储桶权限并允许用户读取和查看(启用读取和查看权限)。 -
prntscr.com/l2lkwb账号有权限
-
您可以授予角色 AmazonS3FullAccess 权限。如果它有效,那么您就知道问题出在授予角色的访问权限上。删除 AmazonS3FullAccess 并将 GetObject 授予您的存储桶并尝试一下。如果它仍然不起作用,那么您将不得不进行一些研究以找出您需要哪些权限,并检查您是否使用了正确的资源(即存储桶)
标签: node.js amazon-web-services amazon-s3 aws-sdk acl