【问题标题】:How to check expiration time of a cached Pre-Signed URL accessKeyId (the signer, not the signature)?如何检查缓存的预签名 URL accessKeyId(签名者,而不是签名)的过期时间?
【发布时间】:2020-04-16 13:28:45
【问题描述】:

我正在为 S3 下载使用一些缓存的预签名 URL,非常简单。我们为每个资产设置了许多 URL,为每个请求提供了许多资产,然后为了避免每个请求生成如此多的新预签名 URL,我们将在远未到期时保存预签名 URL。它大部分时间都可以正常工作,但有时我们会收到带有“令牌已过期”错误消息的 400 Bad Request。

对于我所学到的:

  • S3 预签名 URL 还带有 accessKeyId,它是签名者的身份验证。
  • 签名者密钥也有自己的过期时间。
  • 如果签名者密钥已过期,即使 URL 本身未过期,预签名 URL 也会被拒绝。

所以我的问题是:我如何检查 accessKeyId 的到期时间,因为我的服务器已经可以刷新自己的密钥(并增加服务器实例不同或不是密钥的不确定性)并且我不再有权访问到AWS.config.credentials.expirationTime?

【问题讨论】:

  • AWS 访问密钥不会过期 - 但可以撤销。

标签: node.js amazon-web-services amazon-s3 amazon-iam


【解决方案1】:

很遗憾,我认为您在查看 URL 本身时并不走运。我确定它嵌入在 x_amz_security_token 中,但该令牌的格式并未公布(尽管如果您对它进行 Base64 解码,您会看到一些有趣的可读文本和大量二进制数据)。

相反,我建议您确保签名 URL 的到期日期与签署它的会话的到期日期相同。

您这样做的方式是在服务器上担任一个角色,并使用来自该角色分配的凭据来创建签名 URL。

这个假定的角色只需要对要上传的存储桶拥有s3:PutObject 权限。代入角色会话将具有您请求的任何持续时间,从您代入该角色的时间开始(与您的 Lambda/EC2 实例/其他实例不同,它只会重新生成它们过期的凭证)。

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多