我正在寻找让 Ceph + S3 Java SDK + 预签名 PUT url + CORS 工作的神奇公式。我们可以创建一个存储桶,然后将 CORS 配置应用于该存储桶。然后,我们可以创建一个预先生成的 PUT url,然后将其发送回客户端。但是,CORS 预检(选项)请求失败并返回 403。
针对 AWS,相同的代码效果很好。但是,Swift 和 Ceph 在 OPTIONS 请求上均失败,返回 403。由于 OPTIONS 失败,CORS 失败。我们追踪到(我们认为)RADOSGW 中创建身份验证 header 的方式可能存在缺陷……它与 amazon SDK 使用的签名过程不匹配。例如:
AWS Java auth hdr that gets signed:
PUT
image/jpeg
1404252781
x-amz-meta-origfile:Desert.jpg
/virbsupport/78946140-4638-4338-b765-6f701c453a89?response-content-disposition=attachment; filename=Desert.jpg
In Ceph:
OPTIONS
1404252781
/virbsupport/78946140-4638-4338-b765-6f701c453a89?response-content-disposition=attachment; filename=Desert.jpg
我们可以处理缺少的内容类型和附加元数据字段,但请注意该方法是完全错误的。 RADOSGW 我认为应该使用“Access-Control-Request-Method”作为签名中的方法...而不是用于预检请求的实际 OPTIONS 方法。
有人能够让这个组合发挥作用吗?
请您参考如下方法:
我们最终为此问题向 Ceph RGW 库记录了一个错误。 http://tracker.ceph.com/issues/8718#change-38624