S3 PutObject to CloudFront с использованием предварительно подписанного URL-адреса, созданного для S3, вызывает ошибку

На моем сервере я создаю предварительно подписанный 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 = "

Есть идеи, что случилось?

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

mkopriva 16.03.2019 09:11

При использовании этого подхода я не получаю заголовков, поэтому получаю ту же ошибку.

Lansana Camara 16.03.2019 11:46

Я считаю, что вы пытаетесь сделать что-то неподдерживаемое, но ваше сильно отредактированное сообщение об ошибке затрудняет определение. Подписанный URL содержит Signature или X-Amz-Signature? Также подтвердите, что вы сами не отправляете заголовок Authorization.

Michael - sqlbot 16.03.2019 21:34

Я подтвердил, что заголовок авторизации не устанавливается. Я делаю что-то, чтобы предотвратить это, потому что это была проблема, с которой я имел дело раньше, так что здесь проблема не в этом. Возможно, вы правы, это, вероятно, не поддерживается. Однако я не понимаю, почему, если вы можете выполнить GET/HEAD/OPTIONS, но не можете выполнить POST/PUT, даже если вы включите все эти методы в поведении CloudFront, тогда что-то здесь несовместимо.

Lansana Camara 17.03.2019 03:15

была та же проблема, проблема заключалась в том, что я случайно отправлял другой заголовок авторизации вместе с запросом....

adir abargil 11.05.2021 14:47

@Michael-sqlbot Как это работает для RNFetchblob? Я использую: RNFetchBlob.fetch('POST', url, {Authorization}, RNFetchBlob.wrap(filePath)) Что поставить вместо авторизации? У меня есть только подписанный URL из s3

sj_959 15.06.2021 19:56
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
6
653
0

Другие вопросы по теме