生成的AWS PresignedPost不包括正确的url/字段



我正试图通过预先签署的帖子将文件上传到AWS S3存储桶。

当我使用AWS SDK for Ruby(Version 3(在服务器上生成PresignedPost时,我不会收到客户端成功POST请求的正确url和字段。

在ruby中生成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应用程序中(,我意识到我在正文/标题中需要一些额外的东西,但我预先签署的帖子似乎没有在request.fields:中返回任何有用的东西

const body = new FormData();
Object.entries(request.fields).forEach(([k, v]) => {
body.append(k, v);
});
body.append('file', file);
await fetch(request.url, {
method: 'post',
body: body
});

所以我终于通过创建这样的预签名帖子来完成这项工作:

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代码无需更改。

看起来我设置客户端然后创建bucket的方式没有通过创建一个可行的预签名帖子所需的凭据(我真的不确定为什么AWS应该允许这种情况发生…(。

不管怎样,它现在起作用了!感谢大家的帮助。

最新更新