簡體   English   中英

當我嘗試將 node.js AWS S3“createPresignedPost”與“元數據”一起使用時,出現“根據策略無效”錯誤響應

[英]I got 'Invalid according to Policy' error respo se when I try to use node.js AWS S3 'createPresignedPost' with 'metadata'

我正在嘗試使用 AWS S3 預簽名 URL 使用 Node.js AWS SDK。
我想在 S3 object 上添加關於用戶數據的自定義元數據。

因此,我在“字段”和“條件”中為“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 添加元數據。
(當我嘗試在沒有“x-amz-meta-userid”的情況下使用“createPresignedPost”時,效果很好)

我遇到了同樣的問題,雖然聽起來很尷尬,但我通過更改參數的順序並在最后發送文件參數來解決了這個問題,請嘗試這樣:

.... 
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'));
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM