首页 > 解决方案 > 用于提供图像的临时 S3 存储桶 URL

问题描述

使用“aws/aws-sdk-php”:“^3.0@dev”

我正在创建一个图像共享网站,但不希望人们将我的 URL 复制到另一个站点以窃取我的内容/带宽。

我最初将对象存储为

return $s3->putObject([
        'Bucket' => $bucket,
        'Key'    => $key,
        'Body'   => $file,
        'ACL'    => 'public-read',
    ]);

但是我已经删除了“公开阅读”,所以现在下面的 URL 不再有效

 https://mybucket-images.s3.us-west-1.amazonaws.com/' . $key);

我需要做什么来创建一个仍然可以在客户端缓存以访问对象的临时 URL?

我在想的一件事是每周或每月更改一次密钥,但这需要我使用 cronjob 更新所有对象。一定有办法创建临时访问 URL?

标签: phpamazon-s3

解决方案


使用您的服务器为存储桶中的密钥生成预签名 URL。

//Creating a presigned request
$s3Client = new Aws\S3\S3Client([
    'profile' => 'default',
    'region'  => 'us-east-2',
    'version' => '2006-03-01',
]);

$cmd = $s3Client->getCommand('GetObject', [
    'Bucket' => 'my-bucket',
    'Key'    => 'testKey'
]);

$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$presignedUrl = (string) $request->getUri();

取自https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-presigned-url.html

但是每次您的页面有请求时,您都必须这样做。并且该链接在任何地方都有效。您只需将其有效期最小化。

如果您的网站是基于 API 的,并且您通过 API 检索 url,这可能与您有关:

  • 如果您的网站具有登录功能,您可以在提供预签名 url 之前检查身份验证逻辑。

  • 如果没有,您可以使用 Http Referrer(可以被欺骗)。或者一个 api 密钥(比如在 API Gateway 中)


推荐阅读