预签名 S3 url 在到期时间后有效

Presigned S3 url valid after expiry time

从 SDK 文档 (link: https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html#_createPresignedRequest) 中,$expires 参数应表示 URL 应该过期的时间。

所以如果我指定 2 分钟作为到期时间,2 分钟后 URL 应该无效。我的代码看起来像这样

<?php
$s3 = $this->cloudProvider->getClient(); // S3 client

$cmd = $s3->getCommand(
    'GetObject',
    [
        'Bucket' => $this->getSdkBucket(), // Bucket name
        'Key' => "$s3Name",
    ]
);

$urlReq = $s3->createPresignedRequest($cmd, $expirationTime); // $expirationTime is a Unix timestamp

然后我得到具有正确到期时间的 url(在我的例子中,客户希望它是会话到期时间,会话时间是 4 小时)

  X-Amz-Content-Sha256=UNSIGNED-PAYLOAD
  &X-Amz-Security-Token=long_string_goes_here
  &X-Amz-Algorithm=AWS4-HMAC-SHA256
  &X-Amz-Credential=another_string_goes_here
  &X-Amz-Date=20200907T110127Z
  &X-Amz-SignedHeaders=host
  &X-Amz-Expires=14400 // This decreases depending on how long the user is logged in - max 4hrs
  &X-Amz-Signature=another_string_here

问题是这个 url 将在 4 小时后有效。

根据我在这个答案中读到的关于到期时间 () 的内容,URL 的有效期为 6 小时到 7 天,具体取决于用于生成它的凭据.

我正在使用 IAM 凭证(ECS 提供商)。

那么这是否意味着无论我在 expiry 变量中输入什么值,我都无法使 link 在该时间段内有效?

过期时间由 S3 检查,如果浏览器或代理(例如,如果您使用的是 CloudFront)缓存了文件,则请求将不会到达 S3。如果它被缓存在浏览器中那么不用担心,这意味着 相同的用户 只能在过期后访问 URL。

您可以使用浏览器开发工具来检查这一点。在网络选项卡上,找到已签名 URL 的请求,您可以看到它是否从缓存中返回(来自 memory/disk 缓存)。