![](/img/trans.png)
[英]How to use aws s3 createPresignedPost with ksm encryption
[英]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.