通过签名URL确定存储桶对象的可用性

时间:2016-07-22 13:31:31

标签: google-cloud-storage pre-signed-url

我们的下载托管在Google云端存储上。有一段时间了,我们一直在按需创建已签名的网址(当用户点击下载按钮时),然后将用户重定向到该网址。

此代码已投入生产数月,但最近我们发现存在竞争条件:有时网址还没有准备好。在此之前,尝试访问已签名的网址会产生403: Forbidden

我们尝试通过发送HEAD请求来查询URL是否准备就绪,以寻找200响应,从而缓解此问题。这似乎是一个很好的解决方案,直到我们意识到偶尔存在第三个状态:URL已创建,但尚未准备好。我们的HEAD收到了200 Success响应,其中包含以下XML文档:

<Error>
     <Code>SignatureDoesNotMatch</Code>
     <Message>
          The request signature we calculated does not match the signature
          you provided. Check your Google secret key and signing method.
     </Message>
     <StringToSign>
          GET 1469137341 /our-bucket-name/path/to/file.exe?
             response-content-disposition%3dattachment%3b+filename%3dfile.exe
     </StringToSign>
</Error>

几秒钟后,URL就可以使用了。 The docs on creating signed URLS不要讨论它没有立即准备好的可能性。

我的问题:您应该如何确定何时可以使用新创建的签名网址?

修改

我们实际上已经使用了网址生成代码(并且它已经正常工作了好几个月)。仅在过去两周内,我们才注意到我们使用的回退机制(即URL尚未准备就绪)。它几乎就像谷歌在上个月更改了代码,这导致了URL准备就绪时的延迟。到目前为止,竞争条件并不明显。

0 个答案:

没有答案