我如何把对象的amazon s3使用presigned url?
我正在尝试使用签名的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); });
我得到的url。 但是当我尝试把一个对象,我得到以下错误:
<Error> <Code>AccessDenied</Code> <Message>Access Denied</Message> <RequestId>FXXXXXXXXX</RequestId> <HostId>fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId> </Error>
更新1
这是myuser的政策:
{ "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只有在设置了以下选项时,我才能上传。 我不明白什么是桶策略的使用,如果只是手动select权限的工作。
更新3
以下代码工作。 现在唯一的问题是签名的url
#!/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}
我设法通过使用您的代码成功上传文件。
以下是我遵循的步骤:
-
创build了一个新的存储桶和一个新的IAM用户
-
设置IAM用户的策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1418647210000", "Effect": "Allow", "Action": [ "s3:Put*" ], "Resource": [ "arn:aws:s3:::myBucket/*" ] } ] }
-
没有创build存储桶策略
-
使用您的代码来生成预先签名的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); });
-
在屏幕上复制URL并使用curltesting上传如下:
curl.exe -k -X PUT -T "someFile" "https://myBucket.s3.amazonaws.com/myKey?AWSAccessKeyId=ACCESS_KEY_ID&Expires=1457632663&Signature=Dhgp40j84yfjBS5v5qSNE4Q6l6U%3D"
在我的情况下,通常需要5-10秒才能使策略更改生效,所以如果第一次失败,请务必保持一段时间的发送。
希望这可以帮助。
您已经正确设置了存储桶的权限,以允许用户访问。
但是您还需要编辑用户的策略,以允许用户访问S3服务。
编辑您正在使用的凭据的用户的IAM策略,以生成自签名的URL。 像这样的东西肯定会涵盖一切:
{ "Statement": [ { "Sid": "AllowAllS3Access", "Action": "s3:*", "Effect": "Allow", "Resource": "*" } ] }
- 在您的IAM控制台中, 单击用户
- 在右侧列表中,select您使用的IAM用户(应该是“myuser”)
- 在子选项卡上select权限
- 单击附加策略并selectAmazonS3FullAccess
最后一页会是这样的。
你也可以检查Security Credentials子选项卡,你的accessKeyId应该在列表中。 secretAccessKey只是不能再得到。