На моем сервере я создаю предварительно подписанный URL-адрес S3 следующим образом:
// Initialize a session in us-east-1 that the SDK will use to load
// credentials from the shared credentials file ~/.aws/credentials.
sess, err := session.NewSession(&aws.Config{
Region: aws.String("us-east-1")},
)
if err != nil {
// ...
}
// Create S3 service client.
svc := s3.New(sess)
// Create the S3 PutObject request.
resp, _ := svc.PutObjectRequest(&s3.PutObjectInput{
Bucket: aws.String("REDACTED"),
Key: aws.String(key),
})
// Pre-sign the request to get a URL.
url, err := resp.Presign(20 * time.Second)
if err != nil {
// ...
}
В браузере я делаю PutObject вызов S3, используя предварительно подписанный URL-адрес, например так (обратите внимание, что я меняю REDACTED.s3.amazonaws.com URL-адрес на https://cdn.REDACTED.com, который является моей конечной точкой CloudFront:
http.get(`/get-presigned-url`).subscribe(
(url: string) => {
const s3Url = 'https://REDACTED.s3.amazonaws.com/';
const cloudfrontUrl = 'https://cdn.REDACTED.com/';
http.put(url.replace(s3Url, cloudfrontUrl), file).subscribe(...);
}
);
В ответ браузер выдает мне эту ошибку, 400 Bad Request:
"
InvalidArgumentOnly one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specifiedAuthorizationAWS REDACTED=REDACTED+REDACTED/REDACTED = "
Есть идеи, что случилось?
При использовании этого подхода я не получаю заголовков, поэтому получаю ту же ошибку.
Я считаю, что вы пытаетесь сделать что-то неподдерживаемое, но ваше сильно отредактированное сообщение об ошибке затрудняет определение. Подписанный URL содержит Signature или X-Amz-Signature? Также подтвердите, что вы сами не отправляете заголовок Authorization.
Я подтвердил, что заголовок авторизации не устанавливается. Я делаю что-то, чтобы предотвратить это, потому что это была проблема, с которой я имел дело раньше, так что здесь проблема не в этом. Возможно, вы правы, это, вероятно, не поддерживается. Однако я не понимаю, почему, если вы можете выполнить GET/HEAD/OPTIONS, но не можете выполнить POST/PUT, даже если вы включите все эти методы в поведении CloudFront, тогда что-то здесь несовместимо.
была та же проблема, проблема заключалась в том, что я случайно отправлял другой заголовок авторизации вместе с запросом....
@Michael-sqlbot Как это работает для RNFetchblob? Я использую: RNFetchBlob.fetch('POST', url, {Authorization}, RNFetchBlob.wrap(filePath)) Что поставить вместо авторизации? У меня есть только подписанный URL из s3






Используйте docs.aws.amazon.com/sdk-for-go/api/aws/request/…, чтобы получить правильные заголовки, которые вам нужно включить в запрос, а затем при отправке запроса на размещение из javascript обязательно используйте эти заголовки, возможно, также удалите любые другие заголовки, которые могут быть установлены любой из используемых вами библиотек js. но это не связано с запросом на размещение aws s3.