我正在尝试通过预先签名的帖子将文件上传到AWS S3存储桶。
当我使用适用于Ruby的AWS开发工具包(版本3)在服务器上生成PresignedPost
时,我没有收到正确的URL和字段来让客户端发出成功的POST请求。
在红宝石中生成PresignedPost
:
client = Aws::S3::Client.new(
region: public_bucket_region,
credentials: public_bucket_credentials
)
aws_bucket = Aws::S3::Bucket.new(
public_bucket_name,
client: client
)
request = aws_bucket.presigned_post(
key: 'some-random-key',
acl: 'public-read',
expires: Time.zone.now + 5.minutes
)
puts request.url
=> "https://bucket-name.s3.eu-west-1.amazonaws.com"
puts request.fields
=>
{
Expires: "Wed, 30 Oct 2019 16:53:01 GMT",
acl: "public-read",
key: 'some-random-key'
}
根据文档,这时我要做的就是向返回的URL发出POST请求,包括正文中的字段数据。
但是,这显然还不够,我收到访问被拒绝的错误消息。我希望该URL包含访问密钥ID,签名,策略等?
我想念什么?
编辑:
POST
请求是这样构造的(在React Native应用程序中),我意识到我在body /标头中需要一些额外的东西,但是我的预签名帖子似乎并没有返回{ {1}}:
request.fields
答案 0 :(得分:0)
因此,我最终通过创建这样的预签名帖子来使此工作正常进行:
Aws::S3::PresignedPost.new(
public_bucket_credentials,
public_bucket_region,
public_bucket_name,
{
key: 'some-random-key',
acl: 'public-read',
expires: Time.zone.now + 5.minutes
}
)
然后,我需要的所有内容(访问密钥,签名和策略)都在返回的预签名帖子的fields
键中返回。无需更改React代码。
看起来像我设置客户端然后创建存储桶的方式未传递创建可行的预签名帖子所需的凭据(我不太确定为什么AWS应该允许这种情况发生...)。
无论如何,现在正在工作!感谢大家的帮助。