Вот мой сценарий:
с использованием сервера для генерации предварительно назначенных URL-адресов, которые отправляются в браузер по запросу.Браузер загружает файлы по этим URL-адресам, а затем отправляет результаты загрузок на сервер (чтобы эти файлы не пересекали наши балансировщики нагрузки и т. Д.).Я продолжаю получать сообщения об ошибках 307 и CORS
, файлы зашифрованы с использованием SSE-C и помещены в корзину с частным ACL.Подписанные URL-адреса создаются с использованием первого отсекаемого и используются со вторым
Сервер
const params = {
Bucket: bucket,
Key: objectKey,
Expires: expiration,
SSECustomerAlgorithm: 'AES256',
SSECustomerKey: ssecKey,
SSECustomerKeyMD5: ssecMD5,
Metadata: { filename, userId }
};
return S3Module.S3.getSignedUrl('putObject', params);
Клиент
// ...
uploadToS3(url, file, params) {
return new Promise((resolve, reject) => {
const customHeaders = {
'x-amz-meta-filename': params['x-amz-meta-filename'],
'x-amz-meta-userId': params['x-amz-meta-userId'],
'x-amz-server-side-encryption-customer-algorithm':
params['x-amz-server-side-encryption-customer-algorithm'],
'x-amz-server-side-encryption-customer-key': params['x-amz-server-side-encryption-customer-key'],
'x-amz-server-side-encryption-customer-key-MD5':
params['x-amz-server-side-encryption-customer-key-MD5'],
'x-amz-acl': 'private'
};
superagent
.put(url)
.withCredentials()
.set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
.set(customHeaders)
.send(file)
.end((err, res) => {
if (err) {
return reject(err);
}
console.error(res, err);
resolve(res);
});
});
}
// ...
Я продолжаю получать 307 от S3, что, конечно, не будет работать с CORS.Я немного читал, и некоторые люди говорили, что это временная проблема, связанная с синхронизацией DNS на S3, но, похоже, она не прошла даже при ожидании более 24 часов.
Конфигурация CORS выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://localhost:3000</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Если я заменю регион us-west-2 (чтобы получить https://bucket-name.s3.amazonaws.com
), Я получаю 403 forbidden response
.Если я этого не сделаю, я получу 307 за https://bucket -name.s3.us-west-2.amazonaws.com .Браузер (справедливо) жалуется:
Access to XMLHttpRequest at 'MY URL' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.
Любая помощь будет очень признательна - спасибо!