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

Ruby 生成的AWS PresignedPost不包含正确的url/字段,ruby,amazon-web-services,amazon-s3,aws-sdk,pre-signed-url,Ruby,Amazon Web Services,Amazon S3,Aws Sdk,Pre Signed Url,我试图通过预先签名的帖子将文件上传到AWS S3存储桶 当我使用AWS SDK for Ruby(版本3)在服务器上生成PresignedPost时,我没有收到正确的url和字段,客户端无法成功发出POST请求 在ruby中生成PresignedPost: client=Aws::S3::client.new( 区域:公共区域, 凭据:公共\u桶\u凭据 ) aws_bucket=aws::S3::bucket.new( 公共_bucket_name, 客户:客户 ) 请求=aws_bucket

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

当我使用AWS SDK for Ruby(版本3)在服务器上生成
PresignedPost
时,我没有收到正确的url和字段,客户端无法成功发出POST请求

在ruby中生成
PresignedPost

client=Aws::S3::client.new(
区域:公共区域,
凭据:公共\u桶\u凭据
)
aws_bucket=aws::S3::bucket.new(
公共_bucket_name,
客户:客户
)
请求=aws_bucket.presigned_post(
key:'一些随机键',
acl:“公共读取”,
过期时间:Time.zone.now+5.5分钟
)
放置request.url
=> "https://bucket-name.s3.eu-west-1.amazonaws.com"
放置请求字段
=>
{
到期日期:“2019年10月30日星期三16:53:01 GMT”,
acl:“公共读取”,
键:“一些随机键”
}
根据文档,此时我需要做的就是向返回的URL发出POST请求,包括正文中的字段数据

然而,这显然是不够的,我收到一条拒绝访问的错误消息。我希望URL包含访问密钥id、签名、策略等

我错过了什么

编辑:

POST
请求是这样构造的(在React原生应用程序中),我意识到我需要在正文/标题中添加一些额外的内容,但我的预签名帖子似乎没有返回任何有用的
请求。字段

const body=new FormData();
Object.entries(request.fields).forEach(([k,v])=>{
正文.附加(k,v);
});
body.append('file',file);
等待获取(request.url{
方法:“post”,
身体:身体
});

因此,我最终通过创建如下预签名帖子实现了这一点:

Aws::S3::PresignedPost.new(
公共证书,
公共区域,
公共_bucket_name,
{
key:'一些随机键',
acl:“公共读取”,
过期时间:Time.zone.now+5.5分钟
}
)
然后,我所需要的一切(访问密钥、签名和策略)都会在返回的预签名帖子的
字段中返回。无需更改React代码

看起来我设置客户端然后创建bucket的方式并没有传递创建一个可操作的预签名帖子所需的凭据(我真的不知道为什么AWS应该允许这种情况发生…)


不管怎样,它现在起作用了!感谢所有人的帮助。

因此,我最终通过创建如下预签名帖子实现了这一目标:

Aws::S3::PresignedPost.new(
公共证书,
公共区域,
公共_bucket_name,
{
key:'一些随机键',
acl:“公共读取”,
过期时间:Time.zone.now+5.5分钟
}
)
然后,我所需要的一切(访问密钥、签名和策略)都会在返回的预签名帖子的
字段中返回。无需更改React代码

看起来我设置客户端然后创建bucket的方式并没有传递创建一个可操作的预签名帖子所需的凭据(我真的不知道为什么AWS应该允许这种情况发生…)


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

我不知道Ruby,但是如果您使用:aws\u bucket=client.bucket(public\u bucket\u name)创建bucket对象,然后请求预签名URL,那么会怎么样呢?预签名
POST
不会在URL中放置路径以外的任何内容,路径总是
/
。所有内容都在表单正文中。您能看看随post请求一起发送的参数吗?SDK应该用相关的值填充标题。啊,谢谢@Michael sqlbot,我想我把它和一个
PUT
混淆了。问题是,预签名帖子返回的
字段
仅包括三项内容:
过期
acl
密钥
——没有策略、签名或访问密钥。如果我只是将这三样东西作为表单数据传递,我会得到一个拒绝访问的错误。@BKSpurgeon-我在我原来的帖子中添加了一些额外的信息!我不知道Ruby,但是如果您使用:aws\u bucket=client.bucket(public\u bucket\u name)创建bucket对象,然后请求预签名的URL呢?预签名的
POST
不会在URL中放置路径以外的任何内容,路径总是
/
。所有内容都在表单正文中。您能看看随post请求一起发送的参数吗?SDK应该用相关的值填充标题。啊,谢谢@Michael sqlbot,我想我把它和一个
PUT
混淆了。问题是,预签名帖子返回的
字段
仅包括三项内容:
过期
acl
密钥
——没有策略、签名或访问密钥。如果我只是将这三样东西作为表单数据传递,我会得到一个拒绝访问的错误。@BKSpurgeon-我在我原来的帖子中添加了一些额外的信息!