Как исправить «403 Forbidden» при вводе в S3 предопределенный URL - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь поместить изображение в корзину S3, используя предварительно назначенный URL-адрес. Я использую SAM для локального размещения сайта, и запрос PUT работает правильно. Однако при выполнении команды на моем prod-сервере я получаю ошибку «403 Forbidden».

Стоит отметить, что запрос OPTIONS работает нормально, получите код 200, а затем, когда PUT будет отправлен, получите код 403.

Вещи, которые я уже пробовал:

  • Попытка установки типа контента в качестве типа моего изображения
  • Попробовал поставить тип содержимого заголовка в
  • Попытка установки COMS для разрешения GET, POST, PUT, DELETE
  • Попытка установки доступа для моей лямбда-роли, чтобы иметь доступ администратора

Ничего не помогло, все равно получите "403 Запрещено"

JQuery Ajax:

$.ajax({
    url: presignedUrl,
    type: 'PUT',
    data: image,
    contentType: image.type,
    processData: false,
    success: function (response) {
        // window.location = '/Prod/';
    }
});

Создание заданного URL:

$cmd = $this->client->getCommand('PutObject', [
    'Bucket' => env('AWS_BUCKET'),
    'Key' => 'images/' . $request->input('image_name'),
]);

return $this->client->createPresignedRequest($cmd, '+20 minutes')->getUri();

Генерал из '403 Запрещено':

Request Method: PUT
Status Code: 403 Forbidden
Referrer Policy: no-referrer-when-downgrade

Заголовки ответа из '403 Forbidden':

Access-Control-Allow-Methods: GET, POST, PUT, HEAD
Access-Control-Allow-Origin: *
Connection: close
Content-Type: application/xml
Date: Wed, 15 May 2019 15:02:35 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-id-2: e5WZfJAQk24kl7kBoF+HU8+AOiR7ivTIcUZ71dZl0Ssged03RThlCRtku+AmhRRUwFe1p63cL4Q=
x-amz-request-id: 4767484BEBE4EC07

Запросить заголовки у '403 Forbidden':

Accept: */*
Content-Type: image/jpeg
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36

Локально выставленный запрос работает корректно и не содержит ошибок.

1 Ответ

0 голосов
/ 15 мая 2019

В итоге исправлена ​​проблема.

Я указал учетные данные в клиенте S3, удаление их позволило роли лямбда-функции правильно обращаться к S3.

Неправильно:

        $this->client = new S3Client([
            'credentials' => [
                'key'    => env('AWS_ACCESS_KEY_ID'),
                'secret' => env('AWS_SECRET_ACCESS_KEY'),
            ],
            'region' => env('AWS_DEFAULT_REGION'),
            'version' => 'latest',
        ]);

Правильно:

        $this->client = new S3Client([
            'region' => env('AWS_DEFAULT_REGION'),
            'version' => 'latest',
        ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...