Я использую aws-sdk для Node для вызова getSignedUrl (), чтобы позволить пользователю на моем сайте загрузить файл непосредственно в S3.Контейнер настроен как частный с конфигурацией CORS, как показано ниже.
У меня есть пользователь IAM, с политикой пользователя ниже.Я использую ключ доступа и секрет для этого пользователя для создания подписанного URL.Я знаю, что у пользователя есть необходимый доступ к объектам PUT и GET, поскольку я успешно протестировал оба действия с помощью интерфейса командной строки AWS со своего компьютера.
Я протестировал возвращенный подписанный URL-адрес, используя мой код дропзоны вбраузер, использующий запрос cURL и непосредственно от POSTMAN, и во всех трех я получаю ответ 403 и ошибку «отказано в доступе», как показано ниже.Я указал заголовок «Content-Type» в каждом PUT для подписанного URL.Никаких других заголовков я не добавил явно.Предварительный запрос в браузере возвращает статус 200.
Я также протестировал предоставление пользователю IAM S3FullAccess и добавление подстановочного знака в AllowedOrigin в моей конфигурации CORS.Никаких кубиков ни с одним из них.
Я думаю, что это сужает это до способа, которым я создал подпись.Я пробовал различные комбинации параметров ниже, в течение нескольких дней, но безуспешно.
КОД ПОДПИСАНИЯ
const S3Client = require('aws-sdk/clients/s3');
const s3 = new S3Client({
region: 'eu-west-2',
accessKeyId: process.env.IAM_ACCESS_KEY,
secretAccessKey: process.env.IAM_SECRET_ACCESS_KEY,
signatureVersion: 'v4'
});
const getSignedUploadUrl = function(req, res, next) {
const urlParams = {
Bucket: process.env.S3_BUCKETNAME,
Key: req.body.filename,
Expires: 60 * 60 * 2,
ContentType: req.body.contenttype
};
s3.getSignedUrl('putObject', urlParams, function(err, signedURL) {
if(err){
console.log(err);
} else {
res.status(200).json({
url: signedURL
});
}
});
};
ОШИБКА
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>*****</RequestId>
<HostId>*****</HostId>
</Error>
CORS CONFIG
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://*.mydomain.io</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
ПОЛИТИКА ПОЛЬЗОВАТЕЛЯ IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketPolicy",
"s3:GetBucketCORS"
],
"Resource": "arn:aws:s3:::my-bucket"
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}