我如何把对象的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} 

我设法通过使用您的代码成功上传文件。

以下是我遵循的步骤:

  1. 创build了一个新的存储桶和一个新的IAM用户

  2. 设置IAM用户的策略如下:

     { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1418647210000", "Effect": "Allow", "Action": [ "s3:Put*" ], "Resource": [ "arn:aws:s3:::myBucket/*" ] } ] } 
  3. 没有创build存储桶策略

  4. 使用您的代码来生成预先签名的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); }); 
  5. 在屏幕上复制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": "*" } ] } 
  1. 在您的IAM控制台中, 单击用户
  2. 在右侧列表中,select您使用的IAM用户(应该是“myuser”)
  3. 在子选项卡上select权限
  4. 单击附加策略并selectAmazonS3FullAccess

最后一页会是这样的。

你也可以检查Security Credentials子选项卡,你的accessKeyId应该在列表中。 secretAccessKey只是不能再得到。