谷歌云函数中的 getSignedURL() 生成可以工作几天的链接,然后返回“SignatureDoesNotMatch”

Tho*_*hoe 6 node.js google-cloud-storage firebase firebase-storage

我的 Firebase 存储getSignedUrl()下载链接可以使用几天,然后停止工作。错误信息是

SignatureDoesNotMatch
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
Run Code Online (Sandbox Code Playgroud)

去年夏天,在 GitHub 上对此进行了长时间的讨论,但我没有看到解决方案。

我正在考虑getDownloadURL()从前端使用而不是getSignedUrl()从后端使用。是getDownloadURL()不太安全的,然后getSignedUrl()

这是我的代码,主要是从文档中复制的:

SignatureDoesNotMatch
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
Run Code Online (Sandbox Code Playgroud)

小智 8

预签名 URL 将在您在字段中提供的日期到期expires

但是,您在此处看到的问题是管理 SDK 的 KMS 密钥每 7 天轮换一次。因此,如果您使用自动配置的 storage() 库创建 presignedURL,一旦密钥轮换,您的预签名 URL 将不再有效(因为用于签名的密钥不再有效)。因此,您的 URL 的有效期将小于或等于 7 天,具体取决于密钥的期限。

相反,您不需要使用 admin SDK,而是使用Google Cloud Storage npm 模块并使用服务帐户 json 对其进行初始化。

const storage = new Storage({keyFilename: "key.json"});

或者

`const storage = new Storage({credential: require("key.json")});


Pet*_*uin 5

Google Cloud Storage 签名 URL 的最长持续时间为 7 天。但它也可以更短。再也不会了。我猜 Firebase 存储有相同的限制。

  • 有没有办法从 Google Cloud Function 获取永久下载 URL?我知道如何从浏览器使用 getDownloadURL(),但我无法让它在 Cloud Function 中工作。getDownloadURL() 不是 Node 函数。我可以从浏览器获取永久下载 URL 并从 Cloud Function 获取临时下载 URL,这对我来说似乎很奇怪。不应该反过来吗?浏览器是暂时的,没有人会保持浏览器打开一周。但是当我从 Cloud Function 上传文件时,它是永久性的,下载 URL 应该是永久性的, (3认同)
  • 我犹豫是否给你绿色复选标记,因为这不是我想要的答案,但有充分的理由相信你。文档(https://cloud.google.com/nodejs/docs/reference/storage/2.3.x/File#getSignedUrl)说“expires”是“此链接将过期的时间戳”,而没有提及任何关于七日限制。文档示例中包含“expires: '03-17-2025'”,这意味着您可以将到期日期设置为未来几年。但无论我做什么,下载 URL 都会在 7 天后过期。 (2认同)