Amazon S3 - 如何检查预签名 URL 是否已过期?

Amazon S3 - How to Check if Presigned URL is Expired?

如果我生成的预签名 URL 已过期,我是否应该执行 get_headers()(在 PHP 中)以查看是否抛出 403 Forbidden 错误,否则使用相同的 URL?或者这是一个坏主意,因为它是一个不必要的 GET 请求?我应该总是每次都重新生成一个新的 Presigned URL 吗?我有点困惑,因为这方面的信息似乎不多。

URL 的到期时间为。

签名版本 2

htt ps://bucket.s3.amazonaws.com/foo.txt?AWSAccessKeyId=AKIAABCDEFGHIJK&Expires=1508608760&Signature=xxxxxxxxxxx

Expires 以 Unix 时间戳(以秒为单位)和协调世界时 (UTC) 给出时间。

$ date -d @1508608760
Sat Oct 21 17:59:20 UTC 2017

您可以提取该值并将其与UTC [time()]中的当前时间进行比较,然后决定是否重新生成。


签名版本 4

htt ps://s3.amazonaws.com/bucket/foo.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Expires=3600&X-Amz-Credential=AKIAJRZXXXXXXXXus-east-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Date=20171021T190750Z&X-Amz-Signature=8b84ae9b59e9f8a8d7066ecc39e797c8dc29848abcdef61717

X-Amz-Date 给出 ISO 8601 格式的 UTC 时间。

您可以提取值,将其转换为epoch/UTC并与UTC [time()]中的当前时间进行比较,然后决定是否重新生成。

如果您使用 Memcached(或类似的),您可以选择将预签名 url 推送到具有相同到期时间的 Memcached。 像这样(伪php代码):

$mc->set($your_key, $url, $expiration);

因此,您可以使用

获得 url
$url = $mc->get($your_key);

如果$mc->get returns false,你必须重新生成预签名的url.

在 macOS 上,使用 date -r 1535416265