当我尝试将node.js AWS S3 'createPresignedPost'与'metadata'一起使用时,收到'Invalid according to Policy'错误响应

ee7vknir  于 2022-12-03  发布在  Node.js
关注(0)|答案(1)|浏览(157)

我正在尝试使用AWS S3预签名的URL使用Node.js AWS SDK。
我想在S3对象上添加关于用户数据的自定义元数据。
因此,我在“字段”和“条件”中为“createPresignedPost”添加了“x-amz-meta-userid”。

const result: S3.PresignedPost = await new Promise((resolve, reject) => {
    s3.createPresignedPost({
      Bucket: "my-bucket",
      Fields: {
        key: "my-image",
        "x-amz-meta-userid": "1",
      },
      Expires: 60 * 5, // 5 minutes (unit: seconds)
      Conditions: [
        ["content-length-range", 0, 50 * 1024 * 1024 * 10], // 0 ~ 10mb
        ["eq", "$x-amz-meta-userid", "1"],
      ],

    }, (err, data) => {
      if (err) {
        return reject(err);
      }

      data.fields["x-amz-meta-userid"] = "1";
      return resolve(data);
    });
  });

但是当我使用我创建的预签名URL时,它的响应是这样的。

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>AccessDenied</Code>
    <Message>Invalid according to Policy: Policy Condition failed: ["eq", "$x-amz-meta-userid", "1"]</Message>
    <RequestId>753WHC9TX37JY7C1</RequestId>
    <HostId>DYC2smyh+g4JDGbdlFx1Ub/1YPmexgvCrresMw0KeEE1V3tEMZnbC5F6JtAGUWP+Oegu7kaplHA=</HostId>
</Error>

这是由Postman创建的请求代码。(我使用Postman)

var axios = require('axios');
var FormData = require('form-data');
var fs = require('fs');

var data = new FormData();
data.append('key', 'my-image');
data.append('bucket', 'my-bucket');
data.append('X-Amz-Algorithm', 'AWS4-HMAC-SHA256');
data.append('X-Amz-Credential', 'xxxx');
data.append('X-Amz-Date', '20220529T130050Z');
data.append('Policy', 'xxxx');
data.append('X-Amz-Signature', 'xxxx');
data.append('file', fs.createReadStream('my-photo.jpf'));
data.append('x-amz-meta-userid', '1');

var config = {
  method: 'post',
  url: 'https://s3.amazonaws.com/my-bucket',
  headers: { 
    ...data.getHeaders()
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

我不确定我犯了一个错误,或者我不能为S3预签名的URL添加元数据。
(When我试着在没有“x-amz-meta-userid”的情况下使用“createPresignedPost”,效果很好)

ltskdhd1

ltskdhd11#

我遇到了同样的问题,虽然听起来很尴尬,但我通过更改参数的顺序并在最后发送文件参数来解决它,尝试如下:

.... 
var data = new FormData();
data.append('key', 'my-image');
data.append('bucket', 'my-bucket');
data.append('X-Amz-Algorithm', 'AWS4-HMAC-SHA256');
data.append('X-Amz-Credential', 'xxxx');
data.append('X-Amz-Date', '20220529T130050Z');
data.append('Policy', 'xxxx');
data.append('X-Amz-Signature', 'xxxx');
data.append('x-amz-meta-userid', '1');
data.append('file', fs.createReadStream('my-photo.jpf'));
...

相关问题