【问题标题】:Firebase Cloud Storage getSignedUrl expiration date cannot be in the past (Firebase Cloud Functions)Firebase Cloud Storage getSignedUrl 到期日期不能是过去(Firebase Cloud Functions)
【发布时间】:2018-03-19 23:29:08
【问题描述】:

这是我与问题相关的云函数代码sn-p:

// Somewhere outside the function
import * as nodedt from 'node-datetime'
...

// Inside the function trigger
const dt = nodedt.create((new Date()).valueOf() + 300000)
const exp = dt.format("d-m-Y H:M:S")

return bucket.file(MY_FILE_PATH).getSignedUrl({
    action: 'read',
    expires: exp
})
.then(signedUrl => console.log(`Signed url: ${signedUrl} retrieved.`))
.then(error => console.log(`Failed to retrieve signed url: ${error}`))

函数日志中的输出是:

2017 年 10 月 9 日

上午 1:17:43.087 概述标志
FUNCTIONS_NAME 函数执行耗时 2353 毫秒,完成状态为:'ok'

上午 1:17:43.075 信息
FUNCTIONS_NAME 检索签名网址失败:错误:过期日期不能是过去的日期。

上午 1:17:43.068 信息
FUNCTIONS_NAME 获取在 2017 年 8 月 10 日 18:22:43 到期的签名 URL。当前时间 08-10-2017 18:17:43

这很奇怪,因为在日志中,当我打印出过期日期和当前日期时,很明显过期日期不是过去的(按预期它们相差约 5 分钟)

我最初的分析是因为 Firebase Server 中的时间与我的时区不同(我的是 GMT+7。请注意日志日期是 2017 年 10 月 9 日,日志消息是 2017 年 10 月 8 日)。 如果是这样,那么如何同步时区?我真的不在乎使用哪个时区,因为我想要的只是 5 分钟到期时间,以及expires getSignedUrl() 参数中的字段不能以毫秒值格式化。 (试了一下,打印为NaN-NaN-NaN NaN:NaN:NaN

那么,有什么解决办法吗?怎么做?谢谢

附: Idk 如果这是相关的:我需要将签名的 url 传递到 kraken.io API 以进行图像优化、缩略图创建和基于 EXIF 的自动旋转)。除了使用签名 url 之外的其他选项是首先将图像下载到 os.tmpdir() 文件夹,并在 tmp 中提供该文件的链接,并在该过程完成后调用 fs.unlinkSync()但是如果图像在os.tmpdir() 文件夹中,我知道如何获取 url 链接。

【问题讨论】:

    标签: node.js datetime firebase firebase-storage google-cloud-functions


    【解决方案1】:

    事实证明,它需要采用月-日-年格式。

    例如

    2017 年 4 月 4 日 01-04-2017

    我做了什么:

    2017 年 1 月 1 日 01-04-2017

    【讨论】:

    • 您还可以将到期时间指定为 UNIX 时间格式,即纪元后的秒数。例如,对于五分钟到期,您可以使用 Date.now() + 5 * 60 * 1000
    • 更准确地说,传递给配置对象的值被传递给 Javascript Date() 构造函数。它的一个参数版本预计在纪元之后的毫秒数。底层 Google 端点预计在纪元之后 ,这是 Node.js 客户端 API 执行的转换。
    【解决方案2】:

    在变量上设置日期并且该变量在其到期日期后仍然存在时也可能发生此错误:

    const signedUrlOptions = { // stale options persist even after expiration date
      action: "read",
      expires: Date.now() + 1000 * 60 * 10, // invalid date after ten minutes pass
    };
    
    const fetchImageUrls = async () => {
      const [signedUrl] = await storage.bucket().file("filename").getSignedUrl(signedUrlOptions);
      return signedUrl;
    };
    

    在示例中,您需要确保创建具有未过期日期的“新鲜”选项:

    const fetchImageUrls = async () => {
    
      const signedUrlOptions = { // create fresh options here when calling the function
        action: "read",
        expires: Date.now() + 1000 * 60 * 10, // always a valid date now
      };
    
      const [signedUrl] = await storage.bucket().file("filename").getSignedUrl(signedUrlOptions);
      return signedUrl;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多