Я создаю на своем сервере предварительно назначенный объект AWS S3, используя <code>s3.createPresignedPost()
.Затем я пытаюсь загрузить файл непосредственно в корзину S3 с клиента, используя fetch, используя предопределенные URL-адреса и поля записей, но получаю 403 Forbidden
.
Я попытался вручную добавить поля формы вмой объект FormData для прямого соответствия этому примеру: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html, но по-прежнему получаю ошибку 403.
Функция на стороне сервера для генерации объекта почты
const AWS = require("aws-sdk/global");
const S3 = require("aws-sdk/clients/s3");
const uuidv4 = require("uuid/v4");
AWS.config.update({
accessKeyId: process.env.S3_KEY_ID,
secretAccessKey: process.env.S3_SECRET_KEY,
region: "us-east-1"
});
const s3 = new S3();
const getPresignedPostData = (bucket, directory) => {
const key = `${directory}/${uuidv4()}`;
const postData = s3.createPresignedPost({
Bucket: bucket,
Fields: { Key: key, success_action_status: "201" },
Conditions: [{ acl: "public-read" }],
ContentType: "image/*",
Expires: 300
});
return postData;
};
Возвращает что-то, чтовыглядит так:
{
fields: {
Key: "5cd880a7f8b0480b11b9940c/86d5552b-b713-4023-9363-a9b36130a03f"
Policy: {Base64-encoded policy string}
X-Amz-Algorithm: "AWS-HMAC-SHA256"
X-Amz-Credential: "AKIAI4ELUSI2XMHFKZOQ/20190524/us-east-1/s3/aws4_request"
X-Amz-Date: "20190524T200217Z"
X-Amz-Signature: "2931634e9afd76d0a50908538798b9c103e6adf067ba4e60b5b54f90cda49ce3"
bucket: "picture-perfect-photos"
success_action_status: "201"
},
url: "https://s3.amazonaws.com/picture-perfect-photos"
}
Моя функция на стороне клиента выглядит следующим образом:
const uploadToS3 = async ({ fields, url }, file) => {
const formData = new FormData();
Object.keys(fields).forEach(key => formData.append(key, fields[key]));
formData.append("file", file);
try {
const config = {
method: "POST",
body: formData
};
const response = await fetch(url, config);
if (!response.ok) {
throw new Error(response.statusText);
}
const data = await response.json();
return data;
} catch (err) {
console.log(err.message);
}
};
И моя конфигурация CORS для S3 ведра выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Я ожидаю, чтополучить XML-документ, который отправляется, когда установлен success_action_status: "201"
, но я постоянно получаю 403 Forbidden