【发布时间】:2016-06-17 19:16:00
【问题描述】:
我正在尝试使用签名的 url 将图像上传到 s3 存储桶。以下是我的存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::12345678:user/myuser",
"arn:aws:iam::12345678:root"
]
},
"Action": [
"s3:List*",
"s3:Put*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
]
}
]
}
我正在从服务器生成签名的 url,如下所示:
var aws = require('aws-sdk');
aws.config = {
accessKeyId: myAccessKeyId,
secretAccessKey: mySecretAccessKey
};
var s3 = new aws.s3();
s3.getSignedUrl('putObject', {
Bucket: 'myBucket',
Expires: 60*60,
key: 'myKey'
}, function (err, url) {
console.log(url);
});
我得到了网址。但是当我尝试放置一个对象时,我收到以下错误:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>FXXXXXXXXX</RequestId>
<HostId>fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId>
</Error>
更新 1
这是我的用户的政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::2xxxxxxxxxxx:user/myuser",
"arn:aws:iam::2xxxxxxxxxxx:root"
]
},
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
]
}
]
}
更新 2 我只能在设置以下选项时上传。如果仅手动选择权限工作,我不明白存储桶策略的用途。
更新 3
以下代码有效。现在唯一的问题是签名的网址
#!/bin/bash
file="$1"
bucket="mybucket"
resource="/${bucket}/${file}"
contentType="image/png"
dateValue=`date -R`
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
s3Key="AKxxxxxxxxxxxxxxxxx"
s3Secret="/Wuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X PUT -T "${file}" \
-H "Host: ${bucket}.s3.amazonaws.com" \
-H "Date: ${dateValue}" \
-H "Content-Type: ${contentType}" \
-H "Authorization: AWS ${s3Key}:${signature}" \
https://${bucket}.s3.amazonaws.com/${file}
【问题讨论】:
-
我假设 myAccessKeyId 和 mySecretAccessKey 都属于 myuser?
-
是的,他们属于用户
-
当你生成“myKey”的url时,你正在上传一个名为“myKey”的文件,对吧?
-
@VolkanPaksoy 不一定。上传到 s3 后文件重命名为 myKey。问题不在于这里的文件名。问题是许可。当我将权限设置为所有人时文件上传,当我不设置时访问被拒绝;无论我的存储桶或用户政策如何
-
我明白了。我认为您不需要“委托人”是用户的策略,无论如何它都附加到该用户。我会尝试为该用户附加从列表中选择的完整 S3 访问策略,并尝试使用 CloudBerry 之类的工具上传带有他的密钥的文件,以避免对代码或手动策略的任何可能的疏忽。一旦您可以手动上传文件,我会尝试使用预签名的网址。
标签: javascript node.js amazon-web-services amazon-s3 pre-signed-url