首页 > 解决方案 > 在 Minio 上上传带有预签名放置对象链接的元数据

问题描述

我有一个使用 minio 的 nodejs 客户端生成预签名 URL 的端点。

client.presignedPutObject('my_bucket', 'my_object', 24 * 60 *60 , (err, url) => {});

当我使用 URL 使用 curl 上传文件时,它可以工作。

curl -X "PUT" "http://127.0.0.1:9000/uploads/f72cd073-b0f5-4ca7-9d34-73c5199a85a3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=Q3AM3UQ867SPQQA43P2F%2F20200610%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200610T195808Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host&X-Amz-Signature=5fa4ad5fc550d0418a6087782695d5e805449518e87a9d9314ce91d161193d54 \
 -H 'Content-Type: application/octet-stream'

但我也想上传一些额外的元数据。

当我向请求添加 x-amz-meta-foo 标头时,请求失败,因为签名不匹配

要求:

curl -X "PUT" "http://127.0.0.1:9000/uploads/f72cd073-b0f5-4ca7-9d34-73c5199a85a3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=Q3AM3UQ867SPQQA43P2F%2F20200610%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200610T195808Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host&X-Amz-Signature=5fa4ad5fc550d0418a6087782695d5e805449518e87a9d9314ce91d161193d54&x-amz-meta-foo=bar" \
 -H 'Content-Type: application/octet-stream'

回复:

<Error>
  <Code>SignatureDoesNotMatch</Code>
  <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
  <Key>f72cd073-b0f5-4ca7-9d34-73c5199a85a3</Key>
  <BucketName>uploads</BucketName>
  <Resource>/uploads/f72cd073-b0f5-4ca7-9d34-73c5199a85a3</Resource>
  <RequestId>1617470A098B126C</RequestId>
  <HostId>70ed9ca4-79ec-4b45-9631-6ddefe2a3ede</HostId>
</Error>

有没有办法做到这一点?

使用 minio nodejs 客户端 7.0.16 和 minio 2020-06-03T22:13:49Z

标签: node.jspre-signed-urlminio

解决方案


您收到SignatureDoesNotMatch错误是因为您在生成预签名 URL 时使用的标头应该与您在请求中使用的标头匹配。意思是如果你x-amz-meta-foo在请求中使用header,你应该在生成预签名URL时使用这个header。


推荐阅读