php - 拒绝访问 - 使用预签名 URL 的 S3 资源 - PHP SDK

标签 php amazon-web-services amazon-s3 permissions sdk

我正在生成一个预签名 URL 以允许用户从 S3 存储桶下载文件。我使用以下代码通过 PHP SDK 生成 URL:

public static function get_content_link( $bucket, $key ) {

    //check response code from AWS
    require_once 'aws/aws-autoloader.php';

    $s3 = new Aws\S3\S3Client([
        'version' => 'latest',
        'region'  => 'eu-west-1',
        'credentials' => [
            'key'    => 'MY-KEY',
            'secret' => 'MY-SECRET',
        ],
    ]);

    $cmd = $s3->getCommand('GetObject', [
        'Bucket' => $bucket,
        'Key'    => $key
    ]);

    $request = $s3->createPresignedRequest($cmd, '+500 minutes');

    // Get the actual presigned-url
    $presignedUrl = (string) $request->getUri();

    return $presignedUrl;
}

URL 按预期返回,例如:
https://s3-eu-west-1.amazonaws.com/MY-BUCKET-NAME/product/3166_1480009917388.mov?x-amz-content-sha256=unsigned-payload&x-amz-algorithm=aws4-hmac-sha256&x-amz-credential=akiaiqrmkn276hcpjkaq%2f20161127%2feu-west-1%2fs3%2faws4_request&x-amz-date=20161127t145603z&x-amz-signedheaders=host&x-amz-expires=30000&x-amz-signature=98eaef504f053ca56908ac49c6539c4a8b8e250d7d3a4a12460f4a806ec41c19

当我尝试在浏览器中打开任何返回的链接时,我收到来自 S3 的拒绝访问错误:
<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
  <RequestId>A37839BB23186F72</RequestId>
  <HostId>
yvKTN+CN1TTNk2tqoxxm3MPOGTUSMaRYtbbEFeCzGP7ou5IYf37Z9uBESwUQWDIUR1GUuPbZyuM=
  </HostId>
</Error>

我要提供访问权限的文件位于包含允许公共(public)访问的文件夹的存储桶中,而我尝试访问的文件夹是私有(private)的(称为/product/)。我们的存储桶策略如下所示:
{
        "Version": "2008-10-17",
        "Statement": [
            {
                "Sid": "AllowPublicReadProxies",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "*"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::MY-BUCKET-NAME/proxies*"
            },
            {
                "Sid": "AllowPublicReadThumbs",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "*"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::MY-BUCKET-NAME/thumbs*"
            }
        ]
    }

据我了解,创建预签名 URL 的目的是允许未经身份验证的用户临时访问 protected 文件,而无需修改存储桶或文件夹权限。

有没有人知道我错过了什么或做错了什么?

谢谢!

最佳答案

非常感谢@Michael-sqlbot 为我解决了这个问题。

事实证明,在将预签名 URL 输出到页面时,我强制整个 URL 为小写,因此由于资源在技术上不存在,AWS 返回了拒绝访问错误。

关于php - 拒绝访问 - 使用预签名 URL 的 S3 资源 - PHP SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40830446/

相关文章:

php - 在 MySQL (PHP) 中插入 CURDATE() 和 CURTIME()

php - 用户信息未发送到数据库

php - 删除空格后选择唯一数据

javascript - 如何使用 Elastic Beanstalk 创建 "tmp"目录?

amazon-web-services - 如何授予Amazon SES写入您的Amazon S3存储桶的权限

amazon-web-services - 如何在 S3 上复制克隆/复制文件夹?

PHP Symfony Forms 如何访问嵌套对象中的属性

java - AWS Java SDK 传输管理器仅下载文件夹结构

java - 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

amazon-web-services - 如何从 S3 存储桶中的文件夹中删除带有后缀的图像