放入S3预签名URL时如何修复“ 403 Forbidden”

时间:2019-05-15 15:26:37

标签: php jquery laravel amazon-web-services amazon-s3

我正在尝试使用预签名的URL将图像放入S3存储桶。 我正在使用SAM在本地托管站点,并且PUT请求可以正常工作。但是,在生产服务器上运行命令时,出现“ 403 Forbidden”错误。

值得一提的是,OPTIONS请求可以正常工作,获得200个代码,但是接下来发送PUT则获得403个代码。

我已经尝试过的事情:

  • 试图将内容类型设置为我的图像类型
  • 尝试将标头内容类型放入
  • 试图将COMS设置为允许GET,POST,PUT,DELETE
  • 试图将我的lambda角色的访问权限设置为具有管理员权限

什么都没有得到'403 Forbidden'

jQuery Ajax:

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

创建预签名网址:

$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禁止访问”中的响应标题:

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禁止访问”中请求标头:

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 :(得分:0)

最终解决了该问题。

我已经在S3 Client中指定了凭据,删除它们可以使lambda函数的角色正确访问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',
        ]);